2

我有以下 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();

这非常有效,我收到警报 Age : 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();

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

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

4

3 回答 3

1

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

于 2013-02-26T13:32:51.483 回答
1

任何对象原型都可以随时修改。考虑修改基本Object原型的库/框架......即使是内置对象(Date,String等)都将对Object.prototype它们是否在页面加载时立即发生进行修改

试试这个:

Object.prototype.myTest = function() { console.log('hi'); }
var a = new Date()
a.myTest(); //hi
于 2013-02-26T13:35:20.663 回答
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

这个例子中,p1 有它自己的 getAge 属性,所以当被询问时,它会返回它。另一方面,p2 并没有这个属性,但可以通过“那个链”访问它并返回其原型的属性。

于 2013-02-26T13:35:58.153 回答