我正在阅读我的Javascript,并通过我的阅读材料遇到了两个非常不同的Prototype模式示例。以下是Professional JavaScript for Web Developers, 3rd Edition的示例:
每个函数都是使用原型
property
创建的 包含应该可用的属性和方法的对象 特定引用类型的实例。这个对象字面上是一个 一旦调用构造函数,就会创建对象的原型。
function Person(){}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Dev";
Person.prototype.sayName = function() {
alert(this.name);
};
var person1 = new Person();
person1.sayName(); // "Nicholas"
var person2= new Person();
person2.sayName(); // "Nicholas"
alert(person1.sayName == person2.sayName); // true
以下是Learning JavaScript Design Patterns
的示例GoF将原型模式称为创建对象的模式 基于通过克隆的现有对象的模板。
我们可以将原型模式视为基于原型 继承我们创建的对象,作为其他的原型 对象。原型对象本身有效地用作 构造函数创建的每个对象的蓝图。如果原型 使用的构造函数包含一个名为name for的属性 示例(根据下面的代码示例),然后创建每个对象 通过相同的构造函数也将具有相同的属性。
在现有模式中查看此模式的定义 (非JavaScript)文献,我们可能会发现一次类的引用 再次。现实情况是原型继承避免使用类 共。没有“定义”对象,也没有核心对象 理论。我们只是创建现有功能对象的副本。
使用原型模式的好处之一就是我们 使用JavaScript本身提供的原型优势 而不是试图模仿其他语言的功能。同 其他设计模式,情况并非总是如此。
不仅模式是实现继承的简单方法,而且它 也可以带来性能提升:定义时 在一个对象中的函数,它们都是通过引用创建的(所以所有的孩子都是 对象指向相同的功能)而不是创建自己的 个人副本。
对于那些感兴趣的,真正的原型继承,如中定义的那样 ECMAScript 5标准,需要使用Object.create(我们 以前在本节前面看过)。提醒自己, Object.create创建一个具有指定原型的对象 也可以包含指定的属性(例如Object.create( prototype,optionalDescriptorObjects))。
var myCar = {
name: "Ford Escort",
drive: function () {
console.log( "Weeee. I'm driving!" );
},
panic: function () {
console.log( "Wait. How do you stop this thing?" );
}
};
// Use Object.create to instantiate a new car
var yourCar = Object.create( myCar );
// Now we can see that one is a prototype of the other
console.log( yourCar.name );
我到底错过了什么?第二个是第一个的更新版本吗?它完全是一种不同的模式吗?他为什么不在第二个例子中使用.prototype
?