84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
JavaScript高级程序设计中的6.2.2(p.146)中提到,构造函数模型有这样一个问题:
以这种方式创建函数,会导致不同的作用域链和标识符解析,但创建的Function新实例的新机制仍然是相同的。
这句话该如何理解呢?
人生最曼妙的风景,竟是内心的淡定与从容!
这一小节的目的是向读者说明“构造函数的方式”创建对象存在一个问题:每个方法都要在每个实力上重新创造一遍。
为什么呢?因为每通过构造函数new一个实例,构造函数中的代码就要执行一遍。对于字段属性来说,每个实例的字段本来就应该是独立的,当然没有问题;但是对于方法属性,我们是希望所有的实例是共享同一个的。
为了让读者明白为什么不同实例里面的方法是不同的,作者提醒读者不要忘了函数也是一种“对象”,是Function的实例。为了表达的更清楚,作者把方法定义从this.sayName = function(){...}换成了this.sayName = new Function(...)。目的是让读者不要忘记函数(方法)也是对象的本质,所以每new一次都会产生不同的方法。至于你问的问题,作者是在说:我为了解释问题,把方法定义换了一种形式,这“会导致不同的作用域链和标识符解析”,但是定义函数的本质不变,即不同实例得到了不同的方法。
this.sayName = function(){...}
this.sayName = new Function(...)
我的理解是利用构造函数模式创建的实例是互不相同的,那么由构造函数产生的实例的属性也是互不相同的,虽然创建一个Function新实例的机制是一样的,但是他们已经不是在一个作用域链上了。
另外你可以从new关键字的含义上理解:
创建一个空对象
将空对象的__proto__指向构造函数的prototype
使用空对象作为上下文调用构造函数
所以通过new Function产生的实例并不是同一个实例
其实你可以理解为:function test(){
return function(){};
}var p1 = test();var p2 = test();var p3.........
这一小节的目的是向读者说明“构造函数的方式”创建对象存在一个问题:每个方法都要在每个实力上重新创造一遍。
为什么呢?因为每通过构造函数new一个实例,构造函数中的代码就要执行一遍。对于字段属性来说,每个实例的字段本来就应该是独立的,当然没有问题;但是对于方法属性,我们是希望所有的实例是共享同一个的。
为了让读者明白为什么不同实例里面的方法是不同的,作者提醒读者不要忘了函数也是一种“对象”,是Function的实例。为了表达的更清楚,作者把方法定义从
this.sayName = function(){...}
换成了this.sayName = new Function(...)
。目的是让读者不要忘记函数(方法)也是对象的本质,所以每new一次都会产生不同的方法。至于你问的问题,作者是在说:我为了解释问题,把方法定义换了一种形式,这“会导致不同的作用域链和标识符解析”,但是定义函数的本质不变,即不同实例得到了不同的方法。我的理解是利用构造函数模式创建的实例是互不相同的,那么由构造函数产生的实例的属性也是互不相同的,虽然创建一个Function新实例的机制是一样的,但是他们已经不是在一个作用域链上了。
另外你可以从new关键字的含义上理解:
创建一个空对象
将空对象的__proto__指向构造函数的prototype
使用空对象作为上下文调用构造函数
所以通过new Function产生的实例并不是同一个实例
其实你可以理解为:
function test(){
}
var p1 = test();
var p2 = test();
var p3......
.
.
.