有两段代码。
为什么第一个正确但第二个不正确?
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);
};
}
}
答案 0 :(得分:3)
它们都是不正确的。但稍后会有更多内容。
第二个不正确,因为对象没有prototype
属性。 Only functions have a such a property。
在第二个示例中,this
是一个对象,因此this.prototype
为undefined
。在第一个示例中,您设置的是Person.prototype
,Person
是一个函数,所以一切都很“好”。
为什么第一个例子仍然错误?因为您通常没有理由在构造函数中扩展原型对象。构造函数应该只包含实例特定的代码,并且原型对象应该包含所有实例 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.sayName
,Person
随后可用于{{1}}的新实例。这就是第一个例子有效的原因。