【问题标题】:Javascript prototypal inheritance and object creationJavascript原型继承和对象创建
【发布时间】:2014-11-26 15:26:42
【问题描述】:

我无法理解普通对象和继承创建过程与整个prototype 概念之间的区别。假设我有这个代码:

function Person(name, age,location){
    this.name = name;
    this.age = age;
    this.location = location;
    this.greet = function(){
        return console.log(this.name + " says hi from "+this.location);
    }
}
    Person.prototype = {
        protoGreet: function(){
            console.log(this.name + " says 'that greeting was sent using a prototype'")
        }
    }

var alex = new Person("Alex",29,"earth");
var john = Object.create(Person);
//now I can set john's location john.location = "wherever";
  1. greetprotoGreet 方法有什么区别。它们的行为完全相同。
  2. alexjohn 有什么区别。一个是使用new 关键字创建的,另一个是通过Person "class" 的prototype 属性创建的。
  3. 我想没有正确的方法,因为两者都是正确的,但是我什么时候应该更喜欢一种方法而不是另一种方法?

【问题讨论】:

  • 为每个Person实例创建一个greet函数,而只有一个protoGreet函数,在所有实例之间共享。
  • 一般来说,在原型和属性以及构造函数中的受保护方法上编写泛型方法很方便。如果所有对象都需要它,请使用 proto,如果只有一些需要,请在构造函数中进行。
  • Object.create(Person) 应该是Object.create(Person.prototype),然后不同的是Person 构造函数中所做的任何工作都不会应用于john 对象,除非你这样做@987654337 @
  • 1.我在乎有多少 greet 实例?表现? 2. 某个方法只有一个共享​​>实例有什么好处? 3. 在什么情况下我不需要/不想/不得不使用原始构造函数? 4. 如果我使用Object.create(Person.prototype) 创建一个对象,那么神奇之处在哪里?在Object的构造函数中?

标签: javascript inheritance prototype javascript-objects


【解决方案1】:

原型函数和对象本身函数的区别:
问候函数:这个函数(所有函数都是对象)在实例对象内部,所以每个实例都有自己的问候函数,就像你可以在图片中看到。

protoGreet 函数:位于内存中的一个独立对象(图片中的字面量对象)内,不属于Person 的任何实例。但是Person 的每个实例都有一个指向该对象的隐藏链接(引用)(这个链接称为__proto__)。所以这个对象在Person的所有实例之间共享

我关心有多少个 greet 实例?

内存优化是所有应用程序的本质,实际上 Web 应用程序也不例外。因此,当单个共享对象足以满足您的目的时,为每个实例使用单独的对象可能会违反此规则。但是从性能的角度来看,第一种方式(即 greet 函数)可能比第二种方式(即 protoGreet 函数)更快,因为不会发生称为原型链查找的某个过程。请记住,在这种权衡取舍中,记忆是赢家。

对于您的其他问题,似乎您不知道new 关键字究竟做了什么。所以让我指出一个旁注。

注意:这些步骤将在您使用 new 关键字调用函数时完成。假设我们有以下函数:

function Person (name, age) {
    this.name = name;
    this.age = age;
}
  • 创建一个空的字面量对象,即{}(注意这个对象隐藏的__proto__链接指的是Person.prototype所代表的对象)
  • 调用函数并将所有 this 关键字替换为此 emply 字面量对象(在更专业的术语中,this 指的是空字面量对象)。
  • 指定的属性和方法将被添加到新创建的对象中。 (在本例中为 nameage 属性)。
  • 最终,该对象将从函数中隐式返回。

现在让我们回到您的问题,Object.create(Person.prototype)new Person() 之间有什么区别?

案例new Person() 前面已讨论过。但是Object.create(Person.prototype) 创建了一个空对象并将其 __proto__ 链接到第一个输入参数对象(在本例中为 Person.prototype)并将新创建的对象作为输出返回。

好的,到目前为止,我希望这篇笔记能澄清你的问题,但如果我的回答仍然没有意义,请告诉我你的问题在哪里。

【讨论】:

  • 感谢您的回答。您能否也参考以下问题? 1. 我在乎有多少个 greet 实例?表现? 2. 某个方法只有一个共享实例有什么好处? 3. 在什么情况下我不需要/不想/不得不使用原始构造函数? 4. 如果我使用 Object.create(Person.prototype) 创建一个对象,那么神奇之处在哪里?在 Object 的构造函数中?
  • 谢谢!还有一些事情不完全清楚。对象的创建是通过文字表达式或new 关键字完成的,但继承是由Object.create(Person.prototype) 或例如jon=new Person() 完成的?什么时候我更愿意使用一种方法而不是另一种方法?
  • @undroid 在我看来,使用new 创建对象可能足以满足所有主要目的。另请注意,原型链也通过new 对象创建应用(正如我在上次更新中提到的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多