javascript对原型函数的引用在构造函数中是未定义的

时间:2014-10-22 17:45:47

标签: javascript inheritance prototype

给出以下对象:

function MyObject() {
  window.myFunc1 = this.myFunc1;
  window.myFunc2 = this.__proto__.myFunc2;
}

MyObject.prototype.anotherFunc = function () {
  window.myFunc3 = this.myFunc3;
  window.myFunc4 = this.__proto__.myFunc4;
}

MyObject.prototype.myFunc1 = function () { console.log(1); }

MyObject.prototype.myFunc2 = function () { console.log(2); }

MyObject.prototype.myFunc3 = function () { console.log(3); }

MyObject.prototype.myFunc4 = function () { console.log(4); }

var o = new MyObject();
o.anotherFunc();
window.myFunc1();
window.myFunc2();
window.myFunc3();
window.myFunc4();

fiddle我得到了预期的结果,但是当在离子框架下使用ios应用程序进行测试时,结果(使用safari调试器测试)是:

  window.myFunc1 -> undefined
  window.myFunc2 -> it works!
  window.myFunc3 -> it works!
  window.myFunc4 -> it works!

原型是否在创建之前附加到对象上?

修改

附上小提琴和工作实例,微调问题

2 个答案:

答案 0 :(得分:1)

如果以不寻常的方式创建对象,可能会发生这种情况,并且this绑定的内容与您期望的不同。在我的例子中,我从node模块导出构造函数,并使用new require('module')();创建一个对象,其原型函数的效果与undefined相同。

答案 1 :(得分:0)

  

我得到以下结果[...]

我无法重现。试试这个:

function MyObject() {
  console.log(this.myFunc1);
  console.log(Object.getPrototypeOf(this).myFunc2);
}
MyObject.prototype.anotherFunc = function () {
  console.log(this.myFunc3);
  console.log(Object.getPrototypeOf(this).myFunc4);
}

MyObject.prototype.myFunc1 = function () { }
MyObject.prototype.myFunc2 = function () { }
MyObject.prototype.myFunc3 = function () { }
MyObject.prototype.myFunc4 = function () { }

var o = new MyObject();
o.anotherFunc()
  

在创建对象之前,未将原型附加到对象上吗?

呃,不。原型不能真正附加到不存在的对象:-)最好将它视为同时发生,一个对象是用原型创建的,没有一个就不存在。

你可能意味着在执行构造函数之前创建了对象(及其原型) - 是的。