JavaScript原型链

时间:2014-08-19 00:27:51

标签: javascript prototype-chain

我试图更好地理解通过相同构造函数创建的不同对象实例之间的对象原型之间的关系。

说我有这个:

(function(ns){
 ns.User = function(Id){
    this.Name = "Some Name for " + Id;
    this.Id = Id;
};

})(foo = foo || {});

foo.User.prototype = function(){
var getName = function(){return this.Name;}
return{
    getName:getName
};
}();

$(function(){

var approver = new foo.User("approver1");
alert(approver.getName()); //works fine, shows approver1

var approver2 = new foo.User("approver2");
alert(approver2.getName()); //works fine, shows approver2

approver.prototype.getName = function(){alert(this.Name + " modified");} //<- this doesn't work (why, if foo.User, approver, and approver2 are just js objects with the same prototype chain?)
approver.getName = function(){alert(this.Name + " modified another way");} //<-re-defined this way works but only for approver object, not it's prototype that came from foo.User
});

我的理解是,批准者的原型应该与foo.User.prototype相同,因为它是从foo.User构造的。他们引用相同的原型链,对吗?与approver2相同,是吗?

如果他们都引用相同的原型链,那么它是什么阻止我通过批准者对象修改原型对象?它似乎是approver.prototype.getName是&#39; undefined&#39;但是approver.getName()是有效的,如果getName是对象原型定义的一部分,我就无法获得。

是否与事实foo有关。用户是一个功能对象但批准者/审批者2不是?

我在这段关系中明显遗漏了一些东西。感谢。

2 个答案:

答案 0 :(得分:0)

对象实例没有prototype属性。他们的构造函数的原型用于查找在实例上找不到的成员:Prototypical inheritance - writing up

答案 1 :(得分:0)

对象实例没有原型属性。但是实例有 proto 属性保存prototype属性的引用。

请考虑以下示例:

var Person = function(name){
  this.name = name;
};
Person.prototype.walk=function(){
  this.step().step().step();
};
var bob = new Person("Bob");

See the generated proto property for bob instance