首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IE9不识别原型功能?

IE9不识别原型功能?
EN

Stack Overflow用户
提问于 2014-03-19 09:00:04
回答 2查看 2.7K关注 0票数 3

我正在开发一个AngularJS SPA,并使用原型将行为添加到通过AJAX作为JSON传入的对象中。比方说,我刚刚从AJAX电话中得到了一个时间表x。

我定义了Timetable.prototype.SomeMethod = function(),并使用Objects/Object/setPrototypeOf将x的原型设置为TimeTable.prototype。我也准备好了填充料。

如果我调用x.SomeMethod(),它可以在IE > 9、FF、Chrome等环境中工作。然而,IE9让我头疼,并说抛出一个错误,说明'x没有属性或成员SomeMethod‘。

IE中的调试告诉我,x的_proto_在函数列表中有SomeMethod(),但是调用x.SomeMethod()会产生与所描述的相同的错误。

我如何在IE9中实现这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-24 20:12:18

最后我就是这样解决的:

代码语言:javascript
复制
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;
};
票数 3
EN

Stack Overflow用户

发布于 2014-03-19 23:09:22

评论多于回答

从其他环境中检索到的“扩展”随机对象的主要问题是javascript实际上不允许随机属性名称,例如,随机对象可能有一个属性名,它隐藏了继承的属性。你可以考虑以下几点。

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

代码语言:javascript
复制
function getName(obj) {
    return obj.name;
}

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

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

因此,如果obj表示一个人的数据,您可以这样做:

代码语言:javascript
复制
// 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);

您甚至可以使用数据对象来创建来自不同的接受者的实例,例如,一个数据对象可能代表多个人,或者一个人及其地址,这可能会创建两个相关的对象。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22500685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档