【问题标题】:Confusing Javascript prototype behavior令人困惑的 Javascript 原型行为
【发布时间】:2013-02-26 13:30:27
【问题描述】:

我有以下 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 之后定义的? 是因为“原型”的工作方式吗?

【问题讨论】:

    标签: javascript oop prototype


    【解决方案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 并没有这个属性,但可以通过“那个链”访问它并返回其原型的属性。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        试试这个:

        Object.prototype.myTest = function() { console.log('hi'); }
        var a = new Date()
        a.myTest(); //hi
        

        【讨论】:

        • 我正要投票,但请先不要扩展Object.prototype,这是完全不推荐的,除非你真的真的知道你在做什么。 ..
        • @MaxArt 我可能会将其修改为,“不要扩展Object.prototype 使用可枚举的属性,除非你是认真的。通常自定义方法应该不可是可枚举的,所以应该使用Object.defineProperty()来定义。”
        • @MaxArt:我不建议扩展Object.prototype 是一个好主意,仅作为OP 的示例,证明原型可以随时修改
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多