我有一个来自在线资源的修改过的代码,它讨论了原型继承。
//var spec = form data:
$http.post('https://test.com/account/register', spec)
// handle success
.success(function(data, status) {
deferred.resolve(data);
})
// handle error
.error(function(data) {
deferred.reject(data);
});
我的一点困惑是第一个日志语句,其中a未定义。即使它在功能上方的原型链中,它不应该走链吗?为什么当我使用new来创建一个对象时呢?
谢谢!
答案 0 :(得分:1)
您的困惑源于"构造函数" 与new
关键字后从该函数(实例)创建的对象之间的区别使用。
在您第一次尝试写入控制台时,您实际上并没有调用构造函数:
// The "a" property won't exist because "myObj" isn't being invoked
console.log('myObj dir a is: ' + myObj.a);
必须使用括号调用函数,并且还必须使用new
调用构造函数,以便从中创建 new 对象。
所以,在第一次尝试中,您还没有收到对象实例,因此您获得了undefined
。但是,prototype
对象确实存在,所以如果你写了:
console.log('myObj dir a is: ' + myObj.prototype.a);
你会获得财产价值。
在第二次尝试中,您确实使用了构造函数来创建对象实例。该新实例继承自其指定的原型,因此它获得了原型的a
和b
属性。
该调用隐式返回对已创建的新实例的引用,并且您正在使用myRealObj
变量捕获该引用。
答案 1 :(得分:0)
myObj.prototype
关键字时, new
才会被设置为实例原型链的一部分。如果未使用new
关键字,则没有原型链关系。
当使用new
关键字时,您可以想象以下代码被“注入”到构造函数中:
var myObj = function() {
var this = Object.create(myObj.prototype); // which creates an empty object
// with myObj.prototype on its prototype chain
// your code here...
return this;
};
答案 2 :(得分:0)
有些令人困惑的是,myObj.prototype不是myObj的原型,它是使用myObj作为构造函数创建的新对象的原型。
myObj的原型是myObj.__proto__