Object-Oriented(一)建立对象

自用备忘笔记安全

前言函数

虽然可使用 Object 和对象字面量建立对象,可是若是要建立大量类似的对象又显得麻烦。为解决这个问题,人们开始使用工厂模式的变种。学习

 

工厂模式this

function person(name, age) {
    var o = new Object();
    o.name = name;
    o.age = age;
    o.sayName = function() {
        alert(this.name);
    };
    return o;
}

var person1 = person('Nicholas', 29),
    person2 = person('Greg', 27);

优势:解决了建立多个类似对象的问题spa

缺点:没有解决对象识别的问题,即不知道生成对象是什么类型。prototype

 

构造函数模式设计

function Person(name, age) {
    this.name = name;
    this.age = age;
    this.sayName = function() {
        alert(this.name);
    };
}

var person1 = new Person('Nicholas', 29),
    person2 = new Person('Greg', 27);

优势:解决了对象识别的问题,经过对象能够知道它是由哪一个构造函数生成的。code

person1.constructor == Person  //true
person1 instanceof Person //true
person1 instanceof Object //true

缺点:会在每一个实例对象上生成方法,没有达到复用的效果。对象

person1.sayName == person2.sayName; //false

经过 new 操做符会经历如下 4 个步骤:1. 建立一个新对象;2. 将构造函数的做用域赋给新对象;3. 执行构造函数中的代码;4. 返回新对象。blog

 

原型模式

function Person() {}
Person.prototype.name = 'Nicholas';
Person.prototype.age = 29;
Person.prototype.friends = ['Shelby', Court]; Person.prototype.sayName
= function() { alert(this.name); }; var person1 = new Person();

优势:原型对象上的属性和方法都可以复用。

缺点:引用类型属性被共享,没法传参数自定义实例对象的属性。

var person1 = new Person(),
    person2 = new Person();

person1.friends.push('Van');

console.log(person2.friends); //Shelby, Court, Van

 

组合模式

function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype.sayName = function() {
    alert(this.name);
};

var person1 = new Person('Nicholas', 29);

优势:集合了构造函数模式和原型模式的优势,是最普遍承认的模式。

缺点:构造函数和原型对象的初始化分开书写,对有类概念语言的学习者不友好。

 

动态原型模式

function Person(name, age) {
    this.name = name;
    this.age = age;
    if (typeof this.sayName == 'function') return;
    Person.prototype.sayName = function() {
        alert(this.name);
    }
}

var person1 = new Person('Nicholas', 29);

优势:将原型对象的初始化放入构造函数内部,是最理想的模式。经过检测(任一)方法是否存在,来避免重复对原型对象初始化。

 

寄生构造函数模式

function Person(name, age) {
    var o = new Object();
    o.name = name;
    o.age = age;
    o.sayName = function() {
        alert(this.name);
    };
    return o;
}

var person1 = new Person('Nicholas', 29);

缺点:与工厂模式类似,只是经过 new 操做符调用构造函数。与工厂模式同样,没法解决对象识别的问题,不推荐使用。

 

稳妥构造函数模式

稳妥对象是指没有公共属性,并且方法也不引用 this 的对象。

function Person(name, age) {
    var o = new Object();
    o.sayName = function() {
        alert(name);
    };
    return o;
}

var person1 = Person('Nicholas', 29);

优势:适用于禁止使用 this 和 new 的场景,安全性高,适合某些安全要求高的环节;属性未绑定在实例对象上,只能经过特色方法访问。

缺点:一样没法识别对象类型。

 

参考:《高级程序设计(第3版)》

相关文章
相关标签/搜索