在Javascript中使用原型继承

时间:2016-12-19 18:46:08

标签: javascript

我有一个来自在线资源的修改过的代码,它讨论了原型继承。

//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来创建一个对象时呢?

谢谢!

3 个答案:

答案 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);

你会获得财产价值。

在第二次尝试中,您确实使用了构造函数来创建对象实例。该新实例继承自其指定的原型,因此它获得了原型的ab属性。

该调用隐式返回对已创建的新实例的引用,并且您正在使用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__