联系
- 原型链继承:通过构造函数
Person
创建的对象和通过对象字面量obj
创建的对象,都基于JavaScript的原型链继承机制。它们最终都继承自Object.prototype
。
__proto__
属性:两种方式创建的对象都有__proto__
属性,指向它们的原型对象。
不同
- 构造函数创建的对象:
- 其
__proto__
指向构造函数的prototype
属性。例如通过new Person('John')
创建的对象,其__proto__
指向Person.prototype
。
- 可以通过构造函数的
prototype
属性为所有通过该构造函数创建的对象添加共享属性和方法。
- 对象字面量创建的对象:
- 其
__proto__
直接指向Object.prototype
。因为对象字面量本质上是Object
构造函数的语法糖,相当于new Object({age: 20})
。
- 没有像构造函数那样有一个特定的构造函数
prototype
作为直接原型(除了Object.prototype
)。
代码验证
function Person(name) {
this.name = name;
}
let obj = {age: 20};
let personObj = new Person('Tom');
// 验证构造函数创建对象的原型链
console.log(personObj.__proto__ === Person.prototype); // true,表明构造函数创建对象的__proto__指向构造函数的prototype
console.log(Person.prototype.__proto__ === Object.prototype); // true,表明构造函数的prototype最终指向Object.prototype
// 验证对象字面量创建对象的原型链
console.log(obj.__proto__ === Object.prototype); // true,表明对象字面量创建对象的__proto__直接指向Object.prototype