第六章 面向对象的程序设计

1.构造函数始终都应该以一个大写字母开头


2.虽然可以通过对象实例访问保存在原型中的值,但却不能通过对象实例重写原型中的值


3.在使用for-in循环时,返回的是所有能够通过对象访问的、可枚举的属性,其中既包括存在于实例中的属性,也包括存在于原型中的属性


4.在创建自定义类型最常见的方式,就是将构造函数模式用于定于实例属性,而原型模式用于定义方法和共享的属性。这种方法最大限度地节省了内存,还支持想构造函数传递参数


5.寄生构造函数模式,构造函数返回的对象与在构造函数外创建的对象没有什么不同,因此,不能依赖instanceof操作符来确定对象类型


6.两种继承方式:接口继承和实现继承。接口只继承方法签名,而实现继承则继承实际的方法。ECMAScript只支持实现继承,主要依靠原型链实现的。


7.构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针


8.给原型添加方法的代码一定要放在替换原型的语句之后


9.在通过原型链实现继承时,不能使用对象字面量创建原型方法,因为这样会重写原型链


10.借用构造函数:在子类型构造函数的内部调用超类型构造函数


11.组合继承:将原型链和借用构造函数技术组合到一起。使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。其最大的问题就是无论在声明情况下,都会调用两次超类型构造函数:一次是在创建子类型原型的时候,另一次是在子类型构造函数内部。


12.寄生式继承:创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再返回对象


13.寄生组合式继承:通过借用构造函数来继承属性,通过原型链的混成形式来继承方法。开发人员普遍认为寄生组合式继承是引用类型最理想的继承范式


14.在没有类的情况下,可以采用下列模式创建对象:

①对象字面量:

var person = {

        name: "Kaitlyn",

        age: 22,

        job: "Front - End Engineer",

        sayName: function(){

                alert(this.name);

        }

};

缺点:使用同一个接口创建很多对象,会产生大量的重复代码。

②工厂模式:

function createPerson(name, age, job){

        var o = new Object();

         o.name=name;

        o.age=age;

        o.job=job;

        o.sayName = function(){

                alert(this.name);

        }

        return o;

}

var person1 = createPerson("Kaitlyn", 22, "Front - End Engineer");

var person2 = createPerson("Greg", 27, "Doctor");

缺点:该模式产生的所有对象的类型都是Object。

③构造函数模式:

function Person(name, age, job){

        this. name=name;

        this. age=age;

        this. job=job;

        this. sayName = function(){

                alert(this.name);

        }

}

var person1 = new Person("Kaitlyn", 22, "Front - End Engineer");

var person2 = new Person("Greg", 27, "Doctor");

缺点:每个方法都要在每个实例上重新创建一遍

④原型模式:

function Person(){

}

Person.prototype = {

        name: "Kaitlyn",

        age: 22,

        job: "Front - End Engineer",

        friends = ["Greg", "Court"];

        sayName: function(){

                alert(this.name);

        }

}

var me = new Person();

缺点:所有实例在默认情况下都取得相同的属性值;对于包含引用类型值的属性来说,比如数组,若一个实例向数组中添加了一个字符串数组,那么另一个实例的数组也被修改了。

⑤组合使用构造函数模式和原型模式:

function Person(name, age, job){

        this. name = name;

        this. age = age;

        this. job = job;

        this. friends = ["Greg", "Court"];

}

Person.prototype = {

        constructor: Person,

        sayName: function(){

                alert(this.name);

        }

}

var person1 = new Person("Kaitlyn", 22, "Front - End Engineer");

var person2 = new Person("Greg", 27, "Doctor");

⑥动态原型模式

⑦寄生构造函数模式

⑧稳妥构造函数模式


15.继承模式:

①原型式继承:

②寄生式继承:

③组合式继承:

④寄生组合式继承:

你可能感兴趣的:(第六章 面向对象的程序设计)