动态原型模式,这种模式的目的是将原本独立的构造函数和原型进行整合封装。这样在构造函数中初始化原型(仅在必要的时候),换句话说,可以通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型。来看一个例子:
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.friends = ["Toby", "Tina"];
if (typeof this.sayName != "function") {
Person.prototype.sayName = function() {
console.log(this.name);
}
}
// 以下代码,确保通过 constructor 属性还能像之前的语法那样能够访问到适当的值
Object.defineProperty(Person.prototype, "constructor", {
enumerable: false,
value: Person
});
}
var person1 = new Person("Neo", 29, "Software Engineer");
person1.sayName();
这段代码将输出:
输出结果对应采用这种模式创建的对象,还可以使用 instanceof 操作符确定它的类型。
注意:使用动态原型模式时,不能使用对象字面量重写原型。因为,如果在已经创建了实例的情况下重写原型,那么就会切断现有实例与新原型之间的联系。
网友评论