0

我知道您可以使用此函数设置新对象的原型(阅读 mozzilla 文档),但如果它在这样的对象文字中使用,它是否也会创建自己的属性

return Object.create(this);

我也从一个 Klass 文字中知道这个方法,它只复制实例方法

var subclass = function() { };
subclass.prototype = parent.prototype;
klass.prototype = new subclass;

主要是我对 object.create 方法感兴趣

编辑

  var Klass = {
  init: function(){},

  prototype: {
    init: function(){}
  },

  create: function(){
    var object = Object.create(this);
    console.log('object with class create');
    console.log(object);
    console.log("object's parent is this");
    console.log(this);
    object.parent = this;
    object.init.apply(object, arguments);
    console.log('returned object from create');
    console.log(object);
    return object;
  },

  inst: function(){
    var instance = Object.create(this.prototype);
    console.log('de instance na object create');
    console.log(instance);
    instance.parent = this;
    instance.init.apply(instance, arguments);
    console.log('arguments in inst');
    console.log(arguments);
    return instance;
  },

  proxy: function(func){
    var thisObject = this;
    return(function(){ 
      return func.apply(thisObject, arguments); 
    });
  },

  include: function(obj){
    var included = obj.included || obj.setup;
    for(var i in obj)
      this.fn[i] = obj[i];
    if (included) included(this);
  },

  extend: function(obj){
    var extended = obj.extended || obj.setup;
    for(var i in obj)
      this[i] = obj[i];
    if (extended) extended(this);
  }
};

Klass.fn = Klass.prototype;
Klass.fn.proxy = Klass.proxy;

谢谢,理查德

4

2 回答 2

2

MDN 对象.create

概括

使用指定的原型对象和属性创建一个新对象。

因此,让我们看一个简单的例子,其中一个用new关键字实例化的对象和一个用Object.create;实例化的对象。

function objectDotCreate() {
    this.property = "is defined";
    this.createMe = function () {
        return Object.create(this);
    };
}
var myTestObject = new objectDotCreate();
console.log(myTestObject, myTestObject.createMe());

JSBin

现在看看控制台输出

控制台输出

左:new右:Object.create

如您所见,两者都使用它们的属性创建了一个新的对象实例。

仅有的Object.create

使用指定的原型对象和属性创建一个新对象。

newMDN

[...] 创建用户定义的对象类型或具有构造函数的内置对象类型之一的实例。

因此,使用创建的实例Object.create可以获得对属性的访问权限,因为它们被它所遮蔽,prototype并且使用的那个实例new具有其自己的属性,由其构造函数定义。

所以不,它不会创建自己的属性。(虽然您可以传递一个 Object 来直接定义 Objects 属性描述符)

于 2013-03-27T15:43:39.723 回答
1

它是否也创建自己的属性

如果您阅读文档,它会说“否” ——除非您用第二个参数告诉它这样做。它的基本用途是创建一个新的空对象,并将其内部原型设置为参数。第二个论点会像defineProperties那时一样起作用。

如果它在这样的对象文字中使用

return Object.create(this);

我在这里看不到任何对象文字,但是由于您不使用第二个参数,因此返回的对象将没有自己的属性。

于 2013-03-27T15:51:21.900 回答