javascript原型声明

时间:2014-03-10 05:47:39

标签: javascript prototype-programming

有两段代码。

为什么第一个正确但第二个不正确?

this.prototype出了什么问题?

function Person(name, age, job){

    this.name = name;
    this.age = age;
    this.job = job;

    if (typeof this.sayName != "function"){

        Person.prototype.sayName = function(){
            alert(this.name);
        };

    }
}

function Person(name, age, job){

    this.name = name;
    this.age = age;
    this.job = job;

    if (typeof this.sayName != "function"){

        this.prototype.sayName = function(){
            alert(this.name);
        };

    }
}

3 个答案:

答案 0 :(得分:3)

它们都是不正确的。但稍后会有更多内容。

第二个不正确,因为对象没有prototype属性。 Only functions have a such a property

在第二个示例中,this是一个对象,因此this.prototypeundefined。在第一个示例中,您设置的是Person.prototypePerson是一个函数,所以一切都很“好”。


为什么第一个例子仍然错误?因为您通常没有理由在构造函数中扩展原型对象。构造函数应该只包含实例特定的代码,并且原型对象应该包含所有实例 shared 的属性。

因此,您的上述示例正确写为:

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

Person.prototype.sayName = function(){
    alert(this.name);
};

答案 1 :(得分:0)

关于如何实施原型。

当您说Person.prototype.sayName'Person.prototype'为您提供要修改的'Person'的[[Prototype]]属性时。

当调用this.prototype.sayName时,会检查一个名为'prototype'的属性是否为'this'对象,如果没有找到'this'的[[Prototype]]属性所引用的对象,那么仍然没有找到该对象会导致你失败没定义

P.S。

没有测试过自己,但是这个.__ proto__应该在某些实现中起作用

答案 2 :(得分:0)

this.prototype中的

指的是实例。实例没有原型,构造函数也没有。你可以替换:

if (typeof this.sayName != "function"){
        this.prototype.sayName = function(){
            alert(this.name);
        };
}

if (!Person.prototype.sayName) {
        Person.prototype.sayName = function(){
            alert(this.name);
        };
}

分配给prototpe的方法将存在于所有派生实例中。第一个实例化中第一个代码段中的this.sayName不存在,但您的if ...会抓住它并分配Person.prototype.sayNamePerson随后可用于{{1}}的新实例。这就是第一个例子有效的原因。