下面的函数将在哪里存储在该函数的原型中

时间:2018-08-08 14:45:54

标签: javascript prototype

   function b(){
     this.var = 20;
     ele = 10;
   }
   let a = new b()

因为我看不到ele或this.var都存储在b.prototype构造函数中。

2 个答案:

答案 0 :(得分:2)

如果要在原型上存储属性,只需通过“原型”添加它

function b(){
 this.var = 20;  
}
b.prototype.ele = 10;

let a = new b();

您将能够通过创建的实例“ a”直接访问它

a.ele //will return 10

请记住,原型是单个对象,因此,使用相同构造函数创建的每个实例都将链接到单个原型。

每个实例都有自己的作用域,但共享一个原型。从性能角度来看很重要。

答案 1 :(得分:2)

在使用Javascript声明变量时,您必须格外小心。您当前的代码会创建一个全局变量ele(将其添加为window对象的属性),因为您尚未使用varlet等进行声明。

例如:

function b() {
  this.var = 20;
  ele = 10;
}
let a = new b()

console.log("ele is visible outside: ", ele)
console.log("ele is same as window.ele: ", ele === window.ele)

您对主要问题的回答是:否,实例变量未存储在函数原型中。调用new b()将创建一个新对象,该对象具有您使用this分配的属性。该对象通过原型继承链接到函数的原型:

function b() {
  this.var = 20;
}
let a = new b()

console.log("b.prototype.var?", b.prototype.var)
console.log("a.var?", a.var)

由于原型链接,如果您为b的原型分配了某些东西,则b的实例将可用(只要它们不具有自己的相同属性)。

function b() {
  this.var = 20;
}
b.prototype.testArray = [1, 2, 3] 

let a = new b()
let c = new b()

console.log(a.test, c.test)
console.log("They point to the same object?", a.test === c.test)