Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javascript原型继承_Javascript_Oop_Inheritance_Prototype Chain - Fatal编程技术网

使用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()那样访问它