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.继承模式:
①原型式继承:
②寄生式继承:
③组合式继承:
④寄生组合式继承: