IE9无法识别原型功能?

时间:2014-03-19 09:00:04

标签: javascript internet-explorer internet-explorer-9 prototype

我正在开发一个AngularJS SPA,我正在使用原型来向通过AJAX作为JSON传入的对象添加行为。假设我刚从AJAX调用中获得了时间表x。

我已经定义了Timetable.prototype.SomeMethod = function(),我使用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf来将x的原型设置为TimeTable.prototype。我也有聚酯填充剂。

如果我调用x.SomeMethod(),这适用于IE> 9,FF,Chrome等。然而,IE 9让我头疼并且说出了一个错误,指出'x没有属性或成员SomeMethod'。

IE中的调试向我显示x的 _ proto _ 在函数列表中有SomeMethod(),但是,调用x.SomeMethod()会给出相同的结果如上所述的错误。

如何在IE9中完成这项工作?

2 个答案:

答案 0 :(得分:3)

更多评论而非答案

“扩展”从其他环境中检索的随机对象的主要问题是javascript实际上并不允许随机属性名称,例如随机对象可能具有隐藏继承属性的属性名称。您可以考虑以下内容。

将随机对象纯粹用作数据并将其传递给访问数据并执行所需操作的方法,例如。

function getName(obj) {
    return obj.name;
}

因此,在调用方法时,您将对象传递给作用于对象的函数,并且您可以直接在对象上添加和修改属性。

另一种方法是使用您想要的方法创建一个实例并将对象的属性复制到该实例,但是您仍然存在不允许随机属性名称的问题。但是,可以通过使用不太可能发生冲突的继承属性的名称来减轻这种情况,例如:前缀为___(有点难看),或使用getSomethingsetSomethingcalcLength等命名约定。

因此,如果 obj 代表某人的数据,您可以这样做:

// Setup
function Person(obj){
  for (var p in obj) {
    if (obj.hasOwnProperty(p)) {
      this[p] = obj[p];
    } 
  }
}

Person.prototype.getName = function(){
  return this.name;
};

// Object generated from JSON
var dataFred = {name:'fred'};

// Create a new Person based on data
var p = new Person(dataFred);

您甚至可以使用数据对象从各种组织创建实例,例如:数据对象可能代表多个人,或一个人及其地址,这可能会创建两个相关的对象。

答案 1 :(得分:3)

这就是我最后解决的问题:

Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) {
    if (!isIE9()) {
        obj.__proto__ = proto;
    } else {
        /** IE9 fix - copy object methods from the protype to the new object **/
        for (var prop in proto) {
            obj[prop] = proto[prop];
        }
    }

    return obj;
};

var isIE9 = function() {
    return navigator.appVersion.indexOf("MSIE 9") > 0;
};