首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确的Javascript原型模式定义/示例

正确的Javascript原型模式定义/示例
EN

Stack Overflow用户
提问于 2015-09-10 12:34:07
回答 1查看 572关注 0票数 2

我正在阅读我的Javascript,通过我的阅读,我看到了两个非常不同的原型模式示例。下面是来自面向网络开发人员的专业JavaScript第3版的示例

每个函数都是用一个原型property创建的,它是一个包含属性和方法的对象,这些属性和方法应该可以用于特定引用类型的实例。这个对象实际上是一个原型,一旦构造函数被调用,就会创建这个对象。

代码语言:javascript
复制
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 ))。

代码语言:javascript
复制
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呢?

EN

回答 1

Stack Overflow用户

发布于 2015-09-10 14:21:49

经过大量的研究发现,这两种模式都是原型模式,即使它们看起来完全不同,许多人可能认为只有第一种模式是正确的。

是的,第二个版本是更新的版本,最有可能被使用。

不,这不是一种不同的模式,而是精确的原型模式。

它不使用.prototype的原因是因为Object.create,以及它的第一个参数如何成为它使用原型的对象。

希望这能让每个人都明白:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32502052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档