the*_*her 5 javascript instanceof ecmascript-5
我有一些测试课
TestKlass = (function() {
function TestKlass(value) {
this.value = value != null ? value : 'hello world';
console.log(this.value);
}
return TestKlass;
})();
x = new TestKlass;
x instanceof TestKlass; (gives true)
Run Code Online (Sandbox Code Playgroud)
我有新的空物
y = {}
y instanceof Object
Run Code Online (Sandbox Code Playgroud)
我能找到任何方法来为y设置任何属性,就像这样
y.__proto__ = x.__proto__
y.constructor.prototype = x.constructor.prototype
Run Code Online (Sandbox Code Playgroud)
为了得到这个结果
y instanceof TestKlass => true
Run Code Online (Sandbox Code Playgroud)
================================================== ==
UPD:
所以.我的主要目标 - 创建CLONE功能.现在我的解决方案适合我.请看这段代码:
JavaScript JS对象克隆
Object._clone = function(obj) {
var clone, property, value;
if (!obj || typeof obj !== 'object') {
return obj;
}
clone = typeof obj.pop === 'function' ? [] : {};
clone.__proto__ = obj.__proto__;
for (property in obj) {
if (obj.hasOwnProperty(property)) {
value = obj.property;
if (value && typeof value === 'object') {
clone[property] = Object._clone(value);
} else {
clone[property] = obj[property];
}
}
}
return clone;
};
Run Code Online (Sandbox Code Playgroud)
CoffeeScript JS对象克隆
# Object clone
Object._clone = (obj) ->
return obj if not obj or typeof(obj) isnt 'object'
clone = if typeof(obj.pop) is 'function' then [] else {}
# deprecated, but need for instanceof method
clone.__proto__ = obj.__proto__
for property of obj
if obj.hasOwnProperty property
# clone properties
value = obj.property
if value and typeof(value) is 'object'
clone[property] = Object._clone(value)
else
clone[property] = obj[property]
clone
Run Code Online (Sandbox Code Playgroud)
现在你可以试着这样做
A = new TestKlass
B = Object._clone(A)
B instanceof TestKlass => true
Run Code Online (Sandbox Code Playgroud)
它适用于Moz FF 13.但我认为它不是跨浏览器.和proto已被弃用.
我认为没有通用的解决方案.但也许这会对某些人有所帮助.
也许您应该先阅读以下答案。您想要实现的目标非常简单。不过,在我解释之前,让我们看看您的解决方案:
解决方案1
y.__proto__ = x.__proto__;
Run Code Online (Sandbox Code Playgroud)
我不建议这样做,因为该__proto__属性现已弃用。上面的代码在Rhino中不起作用。
解决方案2
y.constructor.prototype = x.constructor.prototype;
Run Code Online (Sandbox Code Playgroud)
这是一个非常糟糕的解决方案。原因是y.constructoris 实际上y.__proto__.constructor和since yis 一个对象y.__proto__与 相同Object.prototype。这意味着这y.constructor与 相同,Object并且您本质上是在更改 的prototype属性Object。这可能会破坏页面上的其他代码。我强烈反对这种做法。
解决方案3(我的解决方案)
您要做的只是更改[[proto]]对象的内部属性。由于没有跨平台的方法来做到这一点,我们需要采用一种黑客手段。一个简单的解决方案是创建一个具有所需__proto__属性的新对象,并在其上设置 getter 和 setter 以更改原始对象。如下所示:
function setPrototypeOf(object, prototype) {
var constructor = function () {
for (var key in object) {
if (object.hasOwnProperty(key)) {
(function (key) {
Object.defineProperty(this, key, {
get: function () {
return object[key];
},
set: function (value) {
object[key] = value;
},
enumerable: true
});
}).call(this, key);
}
}
};
constructor.prototype = prototype;
return new constructor;
}
Run Code Online (Sandbox Code Playgroud)
之后你需要做的就是:
y = setPrototypeOf(y, TestKlass.prototype);
Run Code Online (Sandbox Code Playgroud)
这是一个工作小提琴。
编辑:
克隆函数的问题在于它仅克隆对象和数组。您忘记考虑也通过引用传递的函数。因此,当您克隆一个具有关闭该对象内部状态的方法的对象时,该对象及其克隆将共享相同的内部状态。请参阅以下小提琴:
function Value(value) {
this.get = function () {
alert(value);
};
this.set = function (newValue) {
value = newValue;
};
}
var a = new Value(5);
var b = Object._clone(a);
b.set(10); // setting b to 10 also sets a to 10
a.get(); // alerts 10, should alert 5
Run Code Online (Sandbox Code Playgroud)
JavaScript 中绝对没有办法克隆对象的内部状态,因此 JavaScript 中克隆对象和数组仅适用于不将闭包公开为方法的对象。
要了解有关 JavaScript 中克隆对象的问题的更多信息,请阅读此答案。单击以下链接阅读 John Resig 的回答。
| 归档时间: |
|
| 查看次数: |
2561 次 |
| 最近记录: |