Đó là vì thuộc tính của hàm tạo, chứ không phải là thuộc tính của chính nó. Tuy nhiên, đối tượng prototype
có một tham chiếu đến các nhà xây dựng, vì vậy bạn có thể truy cập vào một của prototype
đối tượng qua constructor
tài sản của mình:
function Foo() {}
Foo.prototype.foo = "bar";
var c = new Foo;
console.log(c.constructor === Foo); // true
console.log(c.constructor.prototype); // { foo: 'bar' }
Tuy nhiên, điều này sẽ không hoạt động nếu bạn ghi đè lên ban đầu prototype
tài sản của hàm constructor:
function Foo() {}
// I overwrite the prototype property, so I lose the initial reference
// to the constructor.
Foo.prototype = {
foo: "bar"
};
var c = new Foo;
console.log(c.constructor === Foo); // false
console.log(c.constructor === Object); // true
console.log(c.constructor.prototype); // {}
Đó là lý do tại sao bạn nên sử dụng phương pháp Object.getPrototypeOf
mới được giới thiệu trong ES5.
function Foo() {}
Foo.prototype = {
foo: "bar"
};
var c = new Foo;
console.log(c.constructor === Foo); // false
console.log(c.constructor === Object); // true
console.log(c.constructor.prototype); // {}
console.log(Object.getPrototypeOf(c)); // { foo: 'bar' }
Một giải pháp khác có thể đã được để đảm bảo bạn khôi phục lại các tài liệu tham khảo constructor
trên nguyên mẫu:
function Foo() {}
// Overwriting the initial prototype
Foo.prototype = {
constructor: Foo, // restore the constructor reference
foo: "bar"
};
Nguồn
2012-04-26 08:44:36
Giải thích tuyệt vời –
@TahaAhmad: Rất vui được giúp! –