0

この関数を使用して新しいオブジェクトのプロトタイプを設定できることは知っていますが ( mozzzilla docu を参照)、このようにオブジェクト リテラル内で使用する場合、独自のプロパティも作成しますか?

return Object.create(this);

インスタンスメソッドのみをコピーするクラスリテラルからこのメソッドも知っています

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 Object.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());

JSビン

コンソール出力を見てみましょう

コンソール出力

左:new右:Object.create

ご覧のとおり、どちらもオブジェクトの新しいインスタンスを作成し、そのプロパティを使用します。

それだけObject.create

指定されたプロトタイプ オブジェクトとプロパティで新しいオブジェクトを作成します。

そしてnew( MDN )

[...] ユーザー定義のオブジェクト型、またはコンストラクター関数を持つ組み込みオブジェクト型のいずれかのインスタンスを作成します。

したがって、 を使用して作成されたインスタンスはObject.create、プロパティにアクセスできます。これは、それらがそのインスタンスによってシャドウされ、使用されたインスタンスprototypenewは、そのコンストラクタによって定義された独自のプロパティがあるためです。

いいえ、独自のプロパティを作成しません。(オブジェクトを渡して、オブジェクトのプロパティ記述子を直接定義することはできますが)

于 2013-03-27T15:43:39.723 に答える
1

独自のプロパティも作成しますか

docsを読むと、No と表示されます-2番目の引数でそうするように指示しない限り。基本的な使い方は、内部プロトタイプを引数に設定して新しい空のオブジェクトを作成することです。2 番目の引数はそのようdefinePropertiesに機能します。

このようにオブジェクトリテラル内で使用されている場合

return Object.create(this);

ここにはオブジェクト リテラルが表示されませんが、2 番目のパラメーターを使用しないため、返されるオブジェクトには独自のプロパティがありません。

于 2013-03-27T15:51:21.900 に答える