-
实例化对象
- 和普调函数一样,只不过调用的时候要和new连用(实例化),不然就是一个普通函数调用
-
function Person () {} const o1 = new Person() //能得到一个空对象 const o2 = Person() //什么也得不到,这就是普通的函数调用
-
原型
原型就是一个为对象实例定义了一些公共属性和公共方法的对象模板。
-
函数原型--prototype
每一个函数天生自带一个成员,叫做prototype,是一个对象空间。
在函数的prototype里面存储的内容,不是给函数使用的,是给函数的每一个实例化对象使用的。
-
对象原型__proto__
每一个对象天生自带一个成员,叫做__proto__,是一个对象空间。
这个__proto__对象空间是给每一个对象使用的。
function Person () {}
const o1 = new Person()
console.log(o1.__proto__ === Person.prototype) //true
实例化对象的__proto__和所属的构造函数的prototype是一个对象空间
function Person(name) { this.name = name;
} Person.prototype.sayHello = function() { console.log(`Hello, my name is ${this.name}`);
}; const person1 = new Person('Alice');
person1.sayHello(); // Output: Hello, my name is Alice
在这个例子中,person1
对象通过 __proto__
属性访问 Person.prototype
,从而可以调用 sayHello
方法。
-
constructor
实例化对象的__proto__里面也有一个成员叫做constructor。
这个属性就是指向当前这个对象所属的构造函数。
function Person () {}
const o1 = new Person()
console.log(o1.constructor === Person) //true
-
原型链
- 对象之间的继承关系通过构造函数的prototype指向父类对象,直到指向Object对象为止形成的指向链条。
- 通俗讲: 原型链是原型对象创建过程的历史记录。
- 注:在javascript中,所有的对象都拥有一个__proto__属性指向该对象的原型(prototype) 。
- 当一个对象我们不知道准确的是谁构造的时候,我们就把它看成object的实例化对象
-
也就是说,我们的构造函数的prototype的__proto__指向的是object.prototype
-
那么object.prototype也是一个对象,我们有一句话叫万物皆对象,所以object.prototype就到顶了,object.prototype的__proto__就是null
-
查找顺序:当你访问某个属性时,JavaScript 采用以下顺序查找:
- 看对象本身是否有这个属性。
- 如果没有,查看该对象的
__proto__
是否有这个属性。 - 如果还没有,继续查找
__proto__.__proto__
,依此类推,直到查到Object.prototype
。如果在整个原型链中都未找到,返回undefined
。
-
原型关系图