创建对象后设置原型属性的可移植方法是什么?
What is the portable way of setting prototype property after an object is created?
我有一个从JSON创建的JavaScript对象。我需要将它的prototype属性设置为不同的对象,因为JS5有getter和setter。下面是我需要的一个例子,在Chrome上工作:
function MyObj() { }
MyObj.prototype = {
get myProp : function () { return this._myProp; },
set myProp : function (arg) { this._myProp = arg; }
}
... stuff ...
var instance = JSON.parse(result);
instance.constructor = MyObj;
instance.__proto__ = MyObj.prototype;
使用这段代码,我可以使用原型中定义的getter和setter获取和设置instance
的属性。然而,这是不可移植的,不能在IE上工作,(也不是node,我认为)。
做这件事的合适和便携的方法是什么?
反过来想:
创建一个新的MyObj
实例,然后复制instance
的属性到它。或者给MyObj
一个构造函数,当你提供一个参数:
function MyObj(instance) {
if (instance) {
//copy properties
这样你甚至可以做
var instance = new MyObj(JSON.parse(result));
您可以尝试使用JSON恢复函数。
function revive(json) {
var m = new MyObj(), y;
return JSON.parse(json, function(k, v){
if (!y) y = this;
return k == "" ? m : this == y ? m[k] = v : v
});
}
调用revive('... a json string ...')
,它将吐出一个MyObj
的实例,其属性定义在JSON字符串中。
警告:只有当JSON对象中的第一项是原始值时,这才会起作用。如果在您的情况下这是不可能的,这里有一个相当难看的解决方案:
function revive(json) {
var m = new MyObj(), c = json.charAt(0), y, a;
if (c == '[') {
a = json = '[0,' + json.substring(1);
} else if (c == '{') {
json = '{"@":0,' + json.substring(1);
}
return JSON.parse(json, function(k, v){
if (!y) { y = this; return; }
return k == "" ? m : this == y ? m[a ? k - 1 : k] = v : v
});
}
相关文章:
- 二进制数据的可移植hashCode实现
- 解析主机时,可移植的本机客户端权限被拒绝
- HTML客户端可移植文件生成-无外部资源或服务器调用
- 从字符串中获取 html 标记的最可维护方法是什么
- JavaScript 打破标签的可移植性如何
- 实例化后可从方法访问的 Javascript 局部变量
- 带有多个按钮的 Android 调用方法,可修改方法的 setText
- 如何使 thunks 独立于状态形状以使其可移植
- 可移植函数,用于在单击时从DOM中删除元素
- 如何在自动可执行方法中获取垃圾对象中属性的值
- Meteor:定义可用于方法的服务器函数
- 嵌套的可移植动态项未折叠
- 创建具有数据网格功能的可移植HTML报告
- 我如何使这个JavaScript代码可移植
- 元素.隐藏变量可移植性
- When是对象'原型链上的可调用方法
- 用于html/javascript项目的可移植数据库
- 从Confluence XML或HTML生成可搜索的可移植静态HTML站点
- 创建对象后设置原型属性的可移植方法是什么?
- 对于轻量级、可移植的基于js的web应用程序存储持久数据的最佳方法的建议