我正在开发一个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中实现这一点?
发布于 2014-03-24 20:12:18
最后我就是这样解决的:
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;
};发布于 2014-03-19 23:09:22
评论多于回答
从其他环境中检索到的“扩展”随机对象的主要问题是javascript实际上不允许随机属性名称,例如,随机对象可能有一个属性名,它隐藏了继承的属性。你可以考虑以下几点。
将随机对象纯粹用作数据,并将其传递给访问数据并执行您所需操作的方法。
function getName(obj) {
return obj.name;
}因此,在调用方法时,您可以将对象传递给一个作用于该对象的函数,您可以在该对象上直接添加和修改属性。
另一种方法是使用所需的方法创建一个实例,并将对象的属性复制到它,但是仍然存在不允许随机属性名称的问题。但是,可以通过使用不太可能发生冲突的继承属性的名称来缓解这种情况,例如用_或__作为前缀(这有点难看),或者使用getSomething、setSomething、calcLength等命名约定。
因此,如果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);您甚至可以使用数据对象来创建来自不同的接受者的实例,例如,一个数据对象可能代表多个人,或者一个人及其地址,这可能会创建两个相关的对象。
https://stackoverflow.com/questions/22500685
复制相似问题