【问题标题】:Is there a way to get prototype of an object that was initialized with {}有没有办法获取使用 {} 初始化的对象的原型
【发布时间】:2015-02-16 06:14:25
【问题描述】:

在 JavaScript 中,如果我像这样初始化一个对象:

var foo = {};

有没有办法得到那个对象的原型?原型很可能是未定义的。但实际上,我真正想要的只是 foo 可能具有的已定义字段和函数/方法:

var foo = {

field1: '',
method1: function(){}

};

我正在尝试创建一个经典的继承系统,但 Object.create() 似乎只需要代表原型的参数。

换句话说,我希望var bar = {} 继承自 foo。但是 bar 和 foo 都是用 {} 初始化的对象。

如何在处理或不处理原型的情况下将方法从一个对象添加到另一个对象?

【问题讨论】:

  • 如果您已经有两个构建对象,您可以将一个对象的属性复制到另一个对象。
  • 对象有实例特定的成员,可以用工厂或构造函数设置,还有一个原型链可以用来指定共享成员;通常是行为(函数)和不可变的默认值(原始类型,如字符串和数字)。使用 Object create 来继承实例特定成员和共享成员可能会导致一些意外行为(因为它显示了对原型是什么的误解)也许以下内容可以帮助您:stackoverflow.com/a/16063711/1641941

标签: javascript node.js


【解决方案1】:

当您使用 new 实例化对象时({} 与 new Object() 相同),原型成为其属性。下面是一个原型继承的简单例子:

// Foo constructor
var Foo = function() {};
Foo.prototype = {
    field1: '',
    method1: function(){}
};

// bar constructor
var Bar = function(){
    Foo.call(this); // calling the parent ctor
};
Bar.prototype = Object.create(Foo.prototype); // inherit from Foo
Bar.prototype.constructor = Bar; // set the ctor just in case it was set by Foo

var bar_instance = new Bar();
bar_instance.method1(); // <-- it works!

我建议您阅读 Google 的 Closure 库、PrototypeJS 和 Mootools 类系统的代码,以激发您的努力。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    你可以使用 Object.create():

    var foo = {
       field1: '',
       method1: function(){}
    };
    var bar = Object.create(foo);
    

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      http://jsfiddle.net/kc0Lshrp/1/

      var foo = {};
      foo.constructor.prototype.field1='FOO';
      foo.constructor.prototype.method1=function(){ alert(this.field1)};
      var bar={field1:'BAR'};
      bar.prototype=Object.create(foo);
      bar.method1();
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 2015-03-22
      • 2019-05-28
      • 1970-01-01
      相关资源
      最近更新 更多