更正Javascript原型模式定义/示例

时间:2015-09-10 12:34:08

标签: javascript oop inheritance design-patterns prototype

我正在阅读我的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

0 个答案:

没有答案