javascript代码如下:
var A = function() {
function Person(name) {
this.name = name;
}
var m = function() {
return "Hello " + this.name;
//return "Hello ";
};
Person.prototype.getGreeting = m;
return Person;
};
console.dir(A);
//代码1
//结果正常,无报错
//var B=A();
//console.log(new B("AAAA").getGreeting());
//代码2
//报错:1.js:43 Uncaught TypeError: (intermediate value).getGreeting is not a function
console.log(new A().getGreeting());
//代码3
//结果正常,无报错
console.log(new(new A())("AAAA").getGreeting());
//代码4
//结果正常,无报错
console.log(new(A())("AAAA").getGreeting());
调试过程中,发现报错部分(即代码2)中new A()
对象的原型prototype
其实是包含有getGreeting
这个属性值的。对以上代码有如下几个疑问:
1.new A()
生成的是什么?希望可以从深层次解答。
2.new A()
生成的对象和new(new A())("AAAA")
生成对象的区别?
3.代码1和代码3可看出new A()
和A()
貌似没有什么区别,为什么?
4.问题3new A()
和A()
如果确实是没区别的话,那就是new
关键字没有起实例化
作用,这该怎么理解?
1、由于你return的并不是this这个实例。所以你的
new A()
和A()
结果一样。没有什么深层次,本来new 通过构造函数创建了一个实例this,默认返回的就是它,但这个返回值被你给篡改成了Person这个函数对象,就这么简单。2、通过1知道了
new A()
是Person
这个函数,然后new(new A())("AAAA")
简化一下,就是new (A())('aaaa')
,也就是new Person('aaaa')
;这差别就很明显了吧,一个是构造函数,一个构造函数的实例。3、同1的解释,this的指向问题。
4、this指向。
补充一点:
https://developer.mozilla.org...