每个对象实例都有一个内部属性 [[Prototype]], 用于追踪其原型对象,这个属性也就是一个指向其原型对象的指针
[[Prototype]] 与 prototype之前我们在很多地方看到过 [[Prototype]] 与 prototype 的介绍与使用,发现两者好像一样,又好像哪里不一样,实际上:
[[Prototype]] 是存在于实例对象中,指向原型对象,而访问此属性是需要通过其他方式进行prototype 是存在于原型对象中,或者说构造函数中,此属性是被实例对象共享的,可以直接访问此属性prototype 与 a[n] 的 [[Prototype]] 指向是相同的访问实例对象的原型对象 [[Prototype]],使用 Object.getPrototypeOf() 方法
判断某个对象是否为另一个对象的原型对象,使用方法 isPrototypeOf()
function Person {}
const p = new Person();
console.log(Person.prototype); // Person
console.log(Object.getPrototypeOf(p)); // Person
console.log(Person.prototype === Object.getPrototypeOf(p)); // true, prototype 与 [[Prototype]] 指向相同
console.log(Person.prototype.isPrototypeOf(p)); // true
console.log(Object.prototype.isPrototypeOf(p)); // true
// 创建一个空对象
const anObject = {};
// 调用的是原型对象上的 toString 方法
console.log(anObject.toString()); // [object Object]
// 动态添加设置一个 toString 方法
anObject.toString = () => {
return "[Object Custom]";
};
console.log(anObject.toString()); // [Object Custom]
// 删除 toString 方法
delete anObject.toString;
console.log(anObject.toString()); // [object Object]
// 再删除 toString 方法
delete anObject.toString;
console.log(anObject.toString()); // [object Object]
toString 操作后,再调用 toString 仍然有效,毫无疑问,调用的是原型对象上的 toString 方法toString 方法时,其实是在实例对象上添加了一个 toString 方法,而当我们在第一次删除 toString 方法后,由于实例对象上没有 toString 方法,因此,会沿用原型对象中的 toString 方法