0

为什么这行得通....

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“原型链”。

谢谢。

4

2 回答 2

4
function Person(name) {
   this.name = name;
        speak =  function() {
   alert(this.name);
}

应该

function Person(name) {
   this.name = name;
   this.speak = function () {
      alert(this.name);
   };
}
于 2012-06-18T16:47:57.790 回答
0

实际上,这是您不理解的变量范围。

function Person(name) {
  this.name = name;

  speak = function() {
    alert(this.name);
  }
}

通过在此处省略var之前speak = ...,您创建了一个名为 的全局变量speak,而不是Person's 范围内的变量。在浏览器中,全局变量附加到全局对象window,因此您的代码相当于:

function Person( name ) {
  this.name = name;

  window.speak = function() { alert( this.name ); }

}

Douglas Crockford 写了一些关于原型继承中变量作用域的相关材料,你应该会发现这些材料很有启发性。

于 2012-06-18T16:50:38.970 回答