15

Object.create() で継承するにはどうすればよいですか? 私はこれらを試しましたが、どれも機能していません:

var B = function() {};
var A = function() {};
A = Object.create(B);
A.prototype.C = function() {};

var B = function() {};
var A = function() {};
A.prototype.C = function() {};
A = Object.create(B);

var B = function() {};
A = Object.create(B);
var A = function() {};
A.prototype.C = function() {};

何も機能しませんでした。この新しい Object.create() 関数をどのように使用すればよいですか?

4

7 に答える 7

22

Object.create()あなたがやろうとしているようなコンストラクターではなく、オブジェクトを継承するために使用されます。プロトタイプの親として設定された古いオブジェクトを使用して、ほとんど新しいオブジェクトを作成します。

var A = function() { };
A.prototype.x = 10;
A.prototype.say = function() { alert(this.x) };

var a = new A();
a.say(); //alerts 10

var b = Object.create(a);
b.say(); //alerts 10
b.x = 'hello';
b.say(); //alerts 'hello'

そして、b が単なる a のクローンではないことを確認するために、

a.x = 'goodbye';
delete b.x;
b.say(); //alerts 'goodbye'
于 2010-06-20T16:40:20.217 に答える
17

これに使用するパターンは、次のように、各型をモジュールにラップしcreateprototypeプロパティを公開することです。

var Vehicle = (function(){
        var exports = {};
        exports.prototype = {};
        exports.prototype.init = function() {
                this.mph = 5;
        };
        exports.prototype.go = function() {
                console.log("Going " + this.mph.toString() + " mph.");
        };

        exports.create = function() {
                var ret = Object.create(exports.prototype);
                ret.init();
                return ret;
        };

        return exports;
})();

次に、次のように派生型を構築できます。

var Car = (function () {
        var exports = {};
        exports.prototype = Object.create(Vehicle.prototype);
        exports.prototype.init = function() {
                Vehicle.prototype.init.apply(this, arguments);
                this.wheels = 4;
        };

        exports.create = function() {
                var ret = Object.create(exports.prototype);
                ret.init();
                return ret;
        };

        return exports; 

})();

このパターンでは、各タイプに独自のcreate()機能があります。

于 2011-04-05T01:47:04.900 に答える
0

Object.create を自分で定義できますが、ネイティブでない場合は、 for オブジェクトを使用するすべての for in ループで列挙されることに対処する必要があります。

これまでのところ、Safari5 と Chrome がネイティブにサポートしている新しい Webkit のみです。

于 2010-06-20T16:23:21.950 に答える
0

Douglas の Object.create の元のドキュメントはhttp://javascript.crockford.com/prototypal.htmlにあります。メソッドの定義が含まれていることを確認してください

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}
于 2010-06-20T16:21:07.367 に答える
0

Mozilla Development Center で、 JavaScript の継承に関する有用な情報を見つけることができます。

于 2010-06-20T17:51:49.490 に答える
0

何年も遅れていますが、これに出くわした他の人にとっては。Object.assign は FF と Chrome で使用できます。

この例では、create で Cube を作成しています。最初の Object.create(this) は z プロパティを使用してオブジェクトを作成し、次に Object.assign(obj, Square.create(x,y)) を使用して Square.create を呼び出し、それを返し、obj に格納されている Cube に追加します。 .

 var Square = {
        x: 0,
        y: 0,

        create: function(x,y) {
            var obj = Object.create(this);
            obj.x = x;
            obj.y = y;
            return obj;
        }
    };

 var Cube = {

        z: 0,

        create:function(x,y,z) {
            var obj = Object.create(this);
            Object.assign(obj, Square.create(x,y)); // assign(target,sources...)
            obj.z = z;
            return obj;
        }
    };

// Your code
var MyCube = Cube.create(20,30,40);
console.log(MyCube);
于 2016-02-07T23:13:35.797 に答える