使用javascript原型继承
为什么这样做使用javascript原型继承,javascript,oop,inheritance,prototype-chain,Javascript,Oop,Inheritance,Prototype Chain,为什么这样做 function Person(name) { this.name = name; } Person.prototype.speak = function() { alert(this.name); } var person = new Person("fred"); person.speak(); 但不是这个 function Person(name) { this.name = name; speak = function(
function Person(name) {
this.name = name;
}
Person.prototype.speak = function() {
alert(this.name);
}
var person = new Person("fred");
person.speak();
但不是这个
function Person(name) {
this.name = name;
speak = function() {
alert(this.name);
}
var person = new Person("fred");
person.speak();
我不理解继承是如何工作的,也不理解javascript的“原型链”
谢谢
function Person(name) {
this.name = name;
speak = function() {
alert(this.name);
}
应该是
function Person(name) {
this.name = name;
this.speak = function () {
alert(this.name);
};
}
应该是
function Person(name) {
this.name = name;
this.speak = function () {
alert(this.name);
};
}
实际上,这是一个你不理解的变量范围
function Person(name) {
this.name = name;
speak = function() {
alert(this.name);
}
}
通过在speak=…
之前省略var
,您已经创建了一个名为speak
的全局变量,而不是Person
范围内的变量。在浏览器中,全局变量附加到全局对象窗口
,因此您的代码相当于:
function Person( name ) {
this.name = name;
window.speak = function() { alert( this.name ); }
}
道格拉斯·克罗克福德(Douglas Crockford)写了一篇关于原型继承中的变量范围的文章,您应该会觉得很有启发性。实际上,您不了解的是变量范围
function Person(name) {
this.name = name;
speak = function() {
alert(this.name);
}
}
通过在speak=…
之前省略var
,您已经创建了一个名为speak
的全局变量,而不是Person
范围内的变量。在浏览器中,全局变量附加到全局对象窗口
,因此您的代码相当于:
function Person( name ) {
this.name = name;
window.speak = function() { alert( this.name ); }
}
道格拉斯·克罗克福德(Douglas Crockford)写了一篇关于原型继承中变量作用域的文章,您应该会觉得这很有启发性。阅读本文。如果正确缩进代码,应该更容易发现错误“我不了解继承是如何工作的,或者javascript“原型链”。”这是一个非常好的位置。你只需要开始阅读。这个问题在这个网站上已经被回答了无数次。请阅读此文。如果正确缩进代码,应该更容易发现错误“我不了解继承是如何工作的,或者javascript“原型链”。”这是一个非常好的位置。你只需要开始阅读。这个问题已经在这个网站上被回答了无数次。啊,OP创建了一个全局讲话功能,而不是将其附加到
这个
啊,OP创建了一个全局讲话功能,而不是将其附加到这个
,这其实并不等同,该功能将分配给窗口。每次调用人员时,都要讲话。每次它都是不同的函数对象。也许我应该说“大致相等”。这是为了说明问题。尽管如此,我还是更改了代码。@Jordan关于他创建全局的说法你是对的,但这里的问题是未能将speak()
分配给this
。使用var
会使它成为Person
的私有方法,因此他无法像使用Person.speak()那样访问它代码>。这不是真正等效的,该函数将分配给窗口。每次调用Person
时,都要说。每次它都是不同的函数对象。也许我应该说“大致相等”。这是为了说明问题。尽管如此,我还是更改了代码。@Jordan关于他创建全局的说法你是对的,但这里的问题是未能将speak()
分配给this
。使用var
会使它成为Person
的私有方法,因此他无法像使用Person.speak()那样访问它代码>。