js原型对象
题外话:使用new创建实例发生的五件事
- 在内存中创建一个新对象
- 这个新对象内部的[[Prototype]]特性被赋值为构造函数的prototype属性
- 构造函数内部的this被赋值为这个新对象。(this指向这个新对象)
- 执行构造函数内部的代码(给对象添加属性)
- 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。
原型的理解
只要创建一个函数,就会按照特定规则为这个函数创建一个prototype属性,这个属性指向原型对象。默认情况下,所有原型对象会自动获得一个名为 constructor 的属性指回与之关联的构造函数。然后,因构造函数的不同,可能会给原型对象添加其他属性与方法。
构造函数、实例、原型对象的关系
构造函数、实例、原型对象是3个完全不同的对象。
- 实例的[[Prototype]]特性指向原型对象([[Prototype]]就是chrome浏览器中的__proto__)
- 构造函数的prototype属性指向原型对象
- 实例与原型对象有直接联系 实力与构造函数无直接联系
一些有关原型对象的方法
- isPrototypeOf() 该方法会在传入参数的[[Prototype]]指向调用它的对象是返回true
console.log(Person.prototype.isPrototypeOf(person1))//true
console.log(Person.prototype.isPrototypeOf(person2))//true
//person1和person2是Person new的实例
- Object.getPrototypeOf() 返回参数的内部特行[[Prototype]]的值
console.log(Object.getPrototypeOf(person1) == Person.prototype)//true
- Objct.setPrototypeOf() 可以向实例的私有特性[[Prototype]]写入一个新值 (基本不用)
原型的层级
当原型下属性或者方法的名字 与 实例下的方法或实例的名字相同。则原型下的该属性与方法将会被隐藏
可以通过hasOwnProperty()和查看该属性是在实例还是在原型上。当在实例上则返回ture 否则返回false
function Person(){}
Person.prototype.name = 'zs'
let person = new Person()
console.log(person.hasOwnProperty('name')) //false
person.age = 18
console.log(person.hasOwnProperty('age')) //true
in操作符会在可以通过对象访问指定属性是返回true
Object.keys()方法接受一个对象作为参数 返回包含该对象所有可枚举属性名称的字符串数组
Object.values()方法接受一个对象作为参数 返回对象值的数组
Object.entries()方法接受一个对象作为参数 返回键/值对的数组
组合继承基本思路
使用原型链继承原型上的方法和属性,而通过盗用构造函数继承实例属性。
function SuperType(name){
this.name = name ;
this,colors = ['red','blue','green'];
}
SuperType.prototype.sayName = function(){
console.log(this.name)
}
function SubType(name,age){
//继承属性
SuperType.call(this,name);
this.age = age;
}
//继承方法
SubType.prototype.sayAge = function(){
console.log(this.age)
}
还有原型式继承、寄生式继承、寄生式组合继承等等