Javascript原型继承和对象创建

时间:2014-10-01 17:40:16

标签: javascript inheritance prototype javascript-objects

我无法理解普通对象和继承创建过程与整个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关键字创建的,另一个是通过prototype"类" {/ li>的Person属性创建的。
  3. 我认为没有正确的方式,因为两者都是正确的,但我应该何时更喜欢一种方法呢?

1 个答案:

答案 0 :(得分:2)

原型功能和对象本身功能之间的区别:
greet函数:此函数(所有函数都是对象)位于实例对象内部,因此每个实例都有自己的greet函数,如图所示。

protoGreet函数:位于内存中的独立对象(图片中的文字对象)内,并不归Person的任何实例所有。但是Person的每个实例都有一个隐藏的链接(引用)到该对象(此链接称为__proto__)。因此,此对象在Person

的所有实例之间共享

enter image description here

  

我在乎有多少个问候实例?

内存优化是所有应用程序的本质,实际上Web应用程序没有例外。因此,当单个共享对象足以满足您的需要时,为每个实例使用单独的对象可能违反此规则。但是作为性能观点,第一种方式(即问候函数)可以比第二种方式(即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)并将该新创建的对象作为输出返回。

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