• js中的面向对象程序设计


     面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装、继承、多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义JS中对象:无序属性的集合,其属性可以包含基本值、对象或者函数。可以简单理解为JS的对象是一组无序的值,其中的属性或方法都有一个名字,根据这个名字可以访问相映射的值(值可以是基本值/对象/方法)。

    1、json格式的面向对象,一个命名空间;适合模块化开发插件。不同的模块使用不同的命名空间。也可用于小型项目的开发。

    var person = {
        name : 'My name',
        age : 18,
        getName : function(){
            return this.name;
        }
    }

    2、组合构造函数及原型模式

     目前最为常用的定义类型方式,是组合构造函数模式与原型模式。构造函数模式用于定义实例的属性,而原型模式用于定义方法和共享的属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方方法的引用,最大限度的节约内存。此外,组合模式还支持向构造函数传递参数,可谓是集两家之所长。

    function Person(name, age, job) {
        this.name = name;
        this.age = age;
        this.job = job;
        this.lessons = ['Math', 'Physics'];
    }
    Person.prototype = {
        constructor: Person,//原型字面量方式会将对象的constructor变为Object,此外强制指回Person
        getName: function () {
            return this.name;
        }
    }
    var person1 = new Person('Jack', 19, 'SoftWare Engneer');
    person1.lessons.push('Biology');
    var person2 = new Person('Lily', 39, 'Mechanical Engneer');
    alert(person1.lessons);//Math,Physics,Biology
    alert(person2.lessons);//Math,Physics
    alert(person1.getName === person2.getName);//true,//共享原型中定义方法

    原型模式的缺点是如果属性值是引用类型,那么会造成修改一个对象的这个属性,另一个对象的这个属性也变了。

    构造函数模式的缺点是同一种方法每一个实例都有,而不是共享方法。不够优化。

    继承

    属性的继承:

    function Worker(name,age,job){
        Person.call(this,name,age);    //属性的继承。
        this.job = job;
    }

    方法的继承:

    Worker.prototype = {};
    for(var i in Person.prototype){
        Worker.prototype[i] = Person.prototype[i];
    }
    Worker.prototype.sayJob = function(){
        alert(this.job)
    }

    完整的继承:

    function Person(name,age){
        this.name = name;
        this.age = age;
        this.friends = ['Shelby','Court'];
    }
    Person.prototype = {
        sayName:function(){
            alert(this.name);
        }
    }
    function Worker(name,age,job){
        Person.call(this,name,age);    //属性的继承。
        this.job = job;
    }
    Worker.prototype = {};
    for(var i in Person.prototype){
        Worker.prototype[i] = Person.prototype[i];
    }
    Worker.prototype.sayJob = function(){
        alert(this.job)
    }
    var w = new Worker('li',12,'打杂的');
    var p = new Person('ai',21);
    w.sayName();
    w.sayJob();
    p.sayName();
    p.sayJob();
  • 相关阅读:
    图数据库查询语言
    深入探索Spring Data JPA, 从Repository 到 Specifications 和 Querydsl
    axios 浏览器内存泄露问题解决
    给Swagger换一套皮肤 Knife4j集成记录
    根据经纬度和半径计算经纬度范围
    最火 Web 前端组态软件 (可视化)
    Python-----删除给定目录下的所有文件
    Python----发送邮件yagmail
    python------将"["1","2"]"类型是字符串,转换为["1","2"]类型为列表,即eval()用法
    python----自动生成requirements.txt与导入requirements.txt中的库
  • 原文地址:https://www.cnblogs.com/qianduanjingying/p/5331829.html
Copyright © 2020-2023  润新知