令人困惑的Javascript原型行为

时间:2013-02-26 13:30:27

标签: javascript oop prototype

我有以下Javascript代码;

var Person = function(name, age) {
    this.name = name;
    this.age = age;
    return this;
};

Person.prototype.getAge = function() {
    alert("Age : " + this.age);
}

var p1 = new Person("xyz",10);
p1.getAge();

这很有效,我收到了年龄:10的警告

现在,如果我更新代码如下(在实例化Person对象p1后定义了getAge());

var Person = function(name, age) {
    this.name = name;
    this.age = age;
    return this;
};

var p1 = new Person("xyz",10);

Person.prototype.getAge = function() {
    alert("Age : " + this.age);
}

p1.getAge();

它仍然将输出返回为“年龄:10”

现在我的问题是这是如何正常工作的,因为在我们实例化Person对象p1之后定义了Person.prototype.getAge? 是因为“原型”的运作方式吗?

3 个答案:

答案 0 :(得分:1)

是的,这就是原型的工作方式。您也可以使用此技术扩展字符串,对象和数组。

答案 1 :(得分:1)

任何对象原型都可以随时修改。想想修改基础Object原型的库/框架......即使是内置对象(DateString等)都会对{{1}进行修改是否在页面加载时立即发生

试试这个:

Object.prototype

答案 2 :(得分:1)

javascript中的对象有一种链,如果你要求他们提供属性,他们会返回他们的属性,如果他们没有它,它会尝试在它的链上面找到它,在你的情况下,当要求p1获取其getAge属性,它在Person.prototype中查找它。

var Person = function(name, age) {
    this.name = name;
    this.age = age;
    return this;
};

var p1 = new Person("xyz", 10);
var p2 = new Person("abc", 12);

Person.prototype.getAge = function() {
    alert("Age : " + this.age);
}
p1.getAge = function() {
    alert("I am " + this.age + " years old.");
}

p1.getAge(); // I am 10 years old.
p2.getAge(); // Age : 12

this example中,p1有自己的getAge属性,所以当被问到时,它会返回它。另一方面,p2并不真正具有此属性,但可以通过“该链”访问它并返回其原型的属性。