一、原型
proto原形(属性访问器)
proto**并不是一样属性 ,它是一个访问器,使用getter、setter来调用原型上的方法。**
let hd = {}
hd.__proto__ = '1'
// 是不可以直接给__proto__赋值的。因为它不完全是一个属性,
// 除非使用Object.create(null, {})讲原形去掉
数组的原形为3层、对象的原形为2层、都是基于window之上
创建没有原型的对象
Object.create(null, {})
// 没有原形的对象、完全是字面量的对象。
// null参数如果绑定的是一个对象,那么它的原型就复制了绑定的那个对象、不是继承。
proto和Prototype的区别
只有构造函数才有Prototype原形对象也就是new的对象、并且通过bind()绑定也是更改不了的。
function fun() {
name: '123'
}
var a = new fun()
var b = new fun()
console.log(a.name) // 123
console.log(b.name) // 123
// 多个构造函数的prototype原型对象,是共享一个Prototype的
proto是服务于当前对象的
Prototype是服务于函数实例化后的对象(let a = new function())
所以:创建的对象的父级都是构造对象的prototype
let obj = {} // new Object
console.log(obj.__proto__ == Object.prototype) // true
let arr = [] // new Array
console.log(arr.__proto__ == Array.prototype) // true
let Str = [] // new String
console.log(Str.__proto__ == String.prototype) // true
let Boo = [] // new Boolean
console.log(Boo.__proto__ == Boolean.prototype) // true
指定原形的父级及获取
let a = {}
let b = {}
Object.setPrototypeOf(a, b) // 将a的原形父级绑定到b
Object.getPrototypeOf(a) // 获取a的原形b
原型检测
instanceof
是否在原型链上isPrototypeOf
let a = {}
let b = {}
console.log(b.isPrototypeOf(a)) // false
二、继承
是原型的继承、而不是修改原型
let user = {}