5

newオブジェクトが (1) を使用せずに、および (2) を使用せずにプロトタイプから継承できるようにする方法はありますかObject.create? (私は new がObject.createメソッド内に存在するのではないかと疑っていましたが、Firebug コンソールがそれがネイティブ コードであると私に言った後、まあ、私はそれがネイティブになるのではないかと疑っています。) 「プロトタイプから継承する」と言うとき、私は実際のJavaScript プロトタイプの継承を意味します。 (つまり、単なる模倣ではありません)。実際の継承は、見ればわかります (つまり、__proto__プロパティが存在する、コンストラクターとプロトタイプの間に循環参照がある、継承階層がある)。

私の質問は要約すると、「私たちはかろうじて新しい屋」ですが、継承newObject.create?

4

4 に答える 4

2

ご存知かもしれませんがnewObject.create私たちが呼び出すことができる隠しアクションを実行しますsetPrototype

Object.create = function(proto, properties) {
    var obj = {};
    setPrototype(obj, proto);
    Object.defineProperties(obj, properties);
    return obj;
}

function fakeNew(Constructor) {
    var obj = {};
    setPrototype(obj, Constructor.prototype);
    Constructor.call(obj);
    return obj;
}

「new が Object.create の中にある」または「Object.create が new の中にある」ということではありません。どちらもプロトタイプの割り当てとその他のアクションを行います。

実際には実装する方法がありsetPrototypeますが、それが標準ではないことは確かです。

function setPrototype(obj, proto) {
    obj.__proto__ = proto;
}
于 2013-04-17T13:50:01.080 に答える
2

new[...] 継承とObject.create?の 2 つのメカニズムのみです。

はい、そうです。少なくとも、使用する必要があるのはこれらだけです。

に直接割り当てることもできますが、まだ__proto__標準のプロパティではありません。詳細: MDN - .__proto__

于 2013-04-17T09:32:59.487 に答える
0

Reflect.constructES6 以降では、基本的にnew演算子のように動作する も使用できます。

function Constructor() {}
var instance = Reflect.construct(Constructor, []);
Object.getPrototypeOf(instance); // Constructor.prototype

に近いものが必要な場合はObject.create、ES6 拡張クラスも継承を作成できますが、コンストラクターまたは からのみ作成できますnull

var obj = (class extends null{}).prototype;
delete obj.constructor;
Object.getPrototypeOf(obj); // null
function Constructor() {}
var obj = (class extends Constructor{}).prototype;
delete obj.constructor;
Object.getPrototypeOf(obj); // Constructor.prototype
于 2016-09-04T12:39:04.227 に答える
0

演算子の使用を避けnewながら、プロトタイプ ( のプロトタイプSomeClass) から継承するオブジェクトをインスタンス化するための簡単な解決策は、ファサード コンストラクター関数 (new舞台裏で演算子を使用する) を構築することです。

function SomeClassFacade() {
  return new SomeClass();
}

SomeClass.prototype = {
 /* ... */
};
于 2016-09-04T12:24:26.363 に答える