为什么必须在构造函数之外声明原型?

时间:2014-09-11 11:16:53

标签: javascript prototype

havng这样的代码:

function A(){
  var a=7;
  this.fun = function(){
    return a*2;
  }
}

function B(){
  var a =8;

}
很明显,为了将B原型引用到A,我们需要添加一行:

B.prototype = new A();

我在徘徊为什么制作这样的代码是无效的:

function A(){
  var a=7;
  this.fun = function(){
    return a*2;
  }
}

function B(){
  var a =8;
  this.prototype = new A();
}

当我们需要将原型放在B中的声明中时,我们需要通过以下方式来实现:

function B(){
   var a =8;
   this.__proto__ = new A();
}

并且此类代码无效:

function B(){
  var a =8;
}
B.__proto__ = new A();

现在我正在失去它 - 为什么会这样?为什么我们必须在函数之外声明原型而我们无法在其中声明它,为什么它与 proto 正好相反?

1 个答案:

答案 0 :(得分:0)

1) var A = function () {
   this.x = function () {
      //do something
   };
};

2) var A = function () { };
   A.prototype.x = function () {
     //do something
  };

在第一种情况下,为变量A分配一个值,该值是对函数的引用。当使用A()调用该函数时,该函数不会被调用设置,因此它默认为全局对象,而this.x实际上是window.x。结果是对右侧的函数表达式的引用被赋值给window.x。

在第二种情况下,在第一行中,变量A被赋予对函数的引用。在JavaScript中,默认情况下所有函数对象都具有prototype属性,因此没有单独的代码来创建A.prototype对象。在第二行中,为A.prototype.x分配了对函数的引用。如果它不存在,这将创建一个x属性,如果不存在则创建一个新值。因此,与第一个示例的区别在于表达式中涉及哪个对象的x属性。