对javascript构造函数和原型的ykatz文章感到困惑

时间:2012-12-22 10:32:38

标签: javascript

这个问题受到启发from this article by Yehuda Katz.相关部分是:

  

为了促进面向对象的编程,JavaScript允许   您可以将Function对象用作要使用的原型的组合   对于新对象和要调用的构造函数:

var Person = function(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
}

Person.prototype = {
  toString: function() { return this.firstName + ' ' + this.lastName; }
}
     

这里,我们有一个Function对象,它既是构造函数   函数和用作新对象原型的对象。

我很困惑,因为在我看来,Function对象充当构造函数,原型是不同的。从以下控制台输出chrome中可以清楚地看出这一点:

chrome console output

也就是说,构造函数是上面的函数对象,带有两个参数:firstName和lastName;而原型只是一个普通的对象碰巧有一个属性(toString),而属性又由单独的函数对象function() { return this.firstName + ' ' + this.lastName; }定义

我误解了他说的是什么,或文章不正确?

1 个答案:

答案 0 :(得分:1)

是的,这是不正确的。用于新对象的原型是在对象创建时由构造函数的.prototype属性引用的原型,它是构造函数的一个单独的普通对象。

function Person() {

}

var a = new Person(); //a.__proto__ is assigned Person.prototype

Person.prototype = {}; //This doesn't affect a, because .__proto__ was assigned at creation time

var b = new Person(); //b.__proto__ is assigned Person.prototype, which is just the random object we created with {}