Tại sao nó đại biểu cho nguyên mẫu cũ của a.x và không phải là một phiên bản mới hơn? Tại sao a.y ném undefined thông qua nó được thiết lập trong nguyên mẫu?
Bạn đã tạo hoàn toàn new prototype object
. các đối tượng đã tạo trước khi thuộc tính mẫu thử được thay đổi sẽ có tham chiếu cũ và objects
mới sẽ có prototype
mới.
// was before changing of A.prototype
a.[[Prototype]] ----> Prototype <---- A.prototype
// became after
A.prototype ----> New prototype // new objects will have this prototype
a.[[Prototype]] ----> Prototype // it will still reference to old prototype
Nguyên tắc ngón tay cái là, prototype
được thiết lập thời điểm sáng tạo của đối tượng và sau này bạn không thể thay đổi. Chỉ có thể thêm mới hoặc sửa đổi các thuộc tính hiện có của object’s prototype
.
Tuy nhiên, bạn có thể thực hiện giải pháp thay thế với thuộc tính __proto__
.
function A() {}
A.prototype.x = 10;
var a = new A();
alert(a.x); // 10
var _newPrototype = {
x: 20,
y: 30
};
A.prototype = _newPrototype; //will fail
alert(a.y) // undefined
A.__proto__ = _newPrototype; //will work
alert(a.x);
alert(a.y);
Vì 'a' được tạo từ nguyên mẫu cũ. Nó được liên kết với đối tượng nguyên mẫu, không phải là 'A', do đó nhiệm vụ không thay đổi gì cả. Xem thêm [tại đây] (https://stackoverflow.com/questions/14568239/javascriptinstanceof-operator) hoặc [có] (https: // stackoverflow.com/questions/17474390/define-a-javascript-prototype) – Bergi