如何设置JavaScript对象的类名

如何设置JavaScript对象的类名,javascript,instanceof,ecmascript-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)

我有一些测试课

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)
我有新的空对象

y = {}
y instanceof Object
我能找到任何方法来设置y的属性吗,类似这样的

y.__proto__ = x.__proto__
y.constructor.prototype = x.constructor.prototype
为了得到这个结果

y instanceof TestKlass => true
====================================================

UPD:

所以。我的主要目标是创建克隆功能。现在我的解决方案对我有效。请看下面的代码:

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;
};
# 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
CoffeeScript 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;
};
# 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
现在你可以试着这么做了

A = new TestKlass
B = Object._clone(A)
B instanceof TestKlass => true
与Moz FF 13配合使用效果很好。但我认为这不是跨浏览器。而proto已被弃用


我认为没有普遍的解决办法。但是它可能会对某些人有所帮助。

obj SomeConstructor的instanceof SomeConstructor
检查在obj的原型链中是否找到了SomeConstructor

如果想要继承,需要将FirstConstructor的.prototype设置为新创建的SomeConstructor对象

SomeConstructor = function() {}
FirstConstructor = function() {}
FirstConstroctor.prototype = new SomeConstructor();

var y = new FirstConstroctor();
y instanceof FirstConstructor; // true
y instanceof SomeConstructor ; // true, it bubbles from FirstConstructor.__proto__ to SomeConstructor

也许你应该先读下面的内容。你想要达到的目标其实很简单。但是,在我解释之前,让我们看看您的解决方案:

解决方案1

y.__proto__ = x.__proto__;
我不建议这样做,因为
\uuuuu proto\uuuuu
属性现在不可用。上述代码在中不起作用

解决方案2

y.constructor.prototype = x.constructor.prototype;
这是一个非常糟糕的解决方案。原因是
y.constructor
实际上是
y.\uuu proto\uuuu.constructor
,因为
y
是一个对象
y.\uu proto\uuu
对象.prototype
相同。这意味着
y.constructor
Object
相同,您实际上是在更改
Object
prototype
属性。这可能会破坏页面上的其他代码。我强烈反对这种做法

解决方案3(我的解决方案)

您只需更改对象的内部
[[proto]]
属性即可。因为没有跨平台的方法,所以我们需要使用黑客。一个简单的解决方案是使用所需的
\uuuu proto\uuuu
属性创建一个新对象,并在其上设置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;
}
在此之后,您需要做的就是:

y = setPrototypeOf(y, TestKlass.prototype);
这是一张工作票

编辑:

克隆功能的问题在于它只克隆对象和阵列。您忘记说明也通过引用传递的函数。因此,当您克隆一个对象时,如果该对象的方法改变了该对象的内部状态,则该对象及其克隆将共享相同的内部状态。见下文:

在JavaScript中绝对没有办法克隆对象的内部状态,因此在JavaScript中克隆对象和数组只适用于不将闭包作为方法公开的对象


要了解更多有关JavaScript中克隆对象的问题,请阅读以下内容。点击以下内容阅读John Resig的答案。

y.constructor=x.constructor
?只是一个猜测。。。不过,你真的不应该在意类型。我的意思是,如果有一个简单的方法来伪造它们,它们到底有什么好处?这些答案能为你提供足够的信息吗?如果是这样,你能接受一个答案吗?:-)我只是在寻找最好的解决方案。在深入学习后,我将标记出最佳答案。这一页(俄语)中的Aadit Shah的答案更适合我+1.