次のコードが与えられた場合、プロトタイプチェーンがどのように設定されているかを理解するのに苦労しています。
var Model = {
prototype: {
init: function(){},
log: function(){ console.log('instance method log was called') }
},
log: function(){ console.log('class method log was called') },
create: function() {
var object = Object.create(this);
object.parent = this;
object.prototype = object.fn = Object.create(this.prototype);
return object;
},
init: function() {
var instance = Object.create(this.prototype);
instance.parent = this;
instance.init.apply(instance, arguments);
return instance;
}
}
var User = Model.create();
User.log(); // 'class method log was called'
// create a new method after creation
Model.warn = function() { console.warn('warn was called') }
User.warn() // 'warn was called'
var user = User.init();
user.log(); // 'instance method log was called'
具体的には、この行は create メソッドで私を混乱させます:
object.prototype = object.fn = Object.create(this.prototype);
create メソッドがプロトタイプの Model を指す新しいオブジェクトを作成する方法を理解していますが、最後から 2 番目の行はそのプロトタイプを新しいオブジェクト (Model.prototype) で上書きしているようです。ただし、新しいオブジェクトを作成した後でも Model にメソッドを追加でき、新しいオブジェクトは引き続きそれにアクセスできるため、元のプロトタイプはまだそのままのようです。
誰かが実際に何が起こっているのかを明らかにすることができますか?
編集- このコードは、 O'reilly によるJavascript Web アプリケーションからのものであることを指摘しておきます。