原型
- 在JavaScript中是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个prototype属性,其属性值是一个对象,该对象包含了可以由该构造函数的所有实例共享的属性和方法,当使用构造函数新建一个对象后,在这个对象的内部将包含一个指针,这个指针指向构造函数的prototype属性对应的值,在ES5中这个指针被称为对象的原型,可以用__proto__属性来访问这个属性,但是最好不要使用这个属性,因为不是规范中规定的,ES5中新增了一个Object.getPrototypeOf()方法,可以通过这个方法来获取对象的原型
- 是对象就会有__proto__这个属性(强调是对象);函数也是对象,那么函数也有这个属性,它指向构造函数的原型对象
- 原型对象:原型对象(prototype)被定义为给其他对象提供共享属性的对象
- 函数(function):函数是一种特殊的对象,函数的原型存放在prototype属性上
- 对象(Object): 普通对象的原型是存放到内置属性[[Prototype]]上,可以通过对象的__proto__来访问对象的原型
- 数组(Array): 数组也是一种特殊的对象,但与函数不同的是它的原型和普通对象一样,也是存放到内置属性[[Prototype]]上,可以通过数组的__proto__来访问数组的原型
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
console.log(this.name);
}; // 与声明函数在逻辑上是等价的
}
let person1 = new Person("Nicholas", 29, "Software Engineer");
console.log(person1);
console.log(Person);
console.log(person1.prototype);//undefined
console.log(person1.__proto__);
console.log(Person.prototype);
console.log(person1.__proto__ === Person.prototype);//true
原型链
- 当访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又会有自己的原型,于是就这样一直找下去,也就是原型链的概念。原型链的尽头一般来说都是Object.prototype 所以这就是新建的对象为什么能够使用 toString() 等方法
- 寻找原型链时,如果一直到原型链的末端还没有找到,则返回undefined
- JavaScript 对象是通过引用来传递的,创建的每个新对象实体中并没有一份属于自己的原型副本。当修改原型时,与之相关的对象也会继承这一改变
__proto__、prototype、constructor
__proto__: 是对象就会有这个属性(强调是对象);函数也是对象,那么函数也有这个属性咯,它指向构造函数的原型对象prototype:是函数都会有这个属性(强调是函数),普通对象是没有这个属性的(JS 里面,一切皆为对象,所以这里的普通对象不包括函数对象).它是构造函数的原型对象constructor:这是原型对象上的一个指向构造函数的属性Function.prototype.__proto__===Object.prototype- 每一个对象都有
__proto__属性,__proto__==>Object.prototype(Object 构造函数的原型对象) - 每个函数都
__proto__和prototype属性 - 每个原型对象都有
constructor和__proto__属性,其中constructor指回'构造函数', 而__proto__指向Object.prototype - object是有对象的祖先,所有对象都可以通过
__proto__属性找到它 - Function是所有函数的祖先,所有函数都可以通过
__proto__属性找到它 - 每个函数都有一个
prototype,由于prototype是一个对象,指向了构造函数的原型对象 - 对象的
__proto__属性指向原型,__proto__将对象和原型链接起来组成了原型链
原型链的终点
- Object:
Object.prototype.__proto__(Object是构造函数) Object.prototype.__proto__=== null// true 原型链的终点是null- 原型链上的所有原型都是对象,所有的对象最终都是由 Object 构造的,而 Object.prototype 的下一级是
Object.prototype.__proto__
-------------------------------------------------------------------------------2024.5.11每日一题