我正在阅读我的Javascript,通过我的阅读,我看到了两个非常不同的原型模式示例。下面是来自面向网络开发人员的专业JavaScript第3版的示例
每个函数都是用一个原型
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下面是来自学习JavaScript设计模式的例子
GoF将原型模式称为通过克隆基于现有对象模板创建对象的模式。 我们可以认为原型模式是基于原型继承的,其中我们创建了作为其他对象的原型的对象。原型对象本身被有效地用作构造函数创建的每个对象的蓝图。如果使用的构造函数的原型包含一个名为name的属性(如下面的代码示例所示),那么由同一个构造函数创建的每个对象也将具有相同的属性。 回顾现有(非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呢?
发布于 2015-09-10 14:21:49
经过大量的研究发现,这两种模式都是原型模式,即使它们看起来完全不同,许多人可能认为只有第一种模式是正确的。
是的,第二个版本是更新的版本,最有可能被使用。
不,这不是一种不同的模式,而是精确的原型模式。
它不使用.prototype的原因是因为Object.create,以及它的第一个参数如何成为它使用原型的对象。
希望这能让每个人都明白:)
https://stackoverflow.com/questions/32502052
复制相似问题