原型链

38 阅读1分钟

原型链

原型也是对象      是通过new Object()构造而出

function Obj(name) {
    this.name = name
}
var a = new Obj("小明")

a是由构造函数生成

Obj ---> new  生成a 
Obj.prototype 是由 new Object() ----> 生成
a.__proto__  == Obj.prototype

var b = {
    name: "小红"
}
相当于
var b = new Object();
b.name = "小红"

由上代码可得知以下关系 1.png

Object.prototype.__proto__的结果为null


console.log(Obj.prototype.__proto__ === Object.prototype);
console.log(a.__proto__.__proto__ === Object.prototype);

结果都为true

函数原型链

Function 这个函数浏览器自动生成
Funciton 的protptype和__protp__ 都是Function原型
构造函数(上文Obj)与函数Object 都是由new Function()得出,
所以 函数Object的__proto__是Function的原型对象,
因为所有的原型都是对象 所以Function的原型的__proto__为函数Object的prototype

得出

2.png

instanceof

判断object的原型链中,是否存在instanceof 后面的原型
function Obj(name) {
    this.name = name
}
var a = new Obj("小明")
console.log(a instanceof Obj)
console.log(a instanceof Object)
console.log(a instanceof Function)
打印结果为 true true false

Object.getPrototypeOf(a)

返回对象a的隐式原型
function Obj(name) {
    this.name = name
}
var a = new Obj("小明")
console.log(Object.getPrototypeOf(a) === Obj.prototype);
打印结果为 true

创建空原型的对象

Object.create() 
返回一个新的对象 隐式类型为括号中的内容

3.png

Object.setPrototypeOf(obj,null)
将对象obj的隐式类型设置为null
var obj = {
    a: 1,
    b: 3
}
Object.setPrototypeOf(obj, null)

4.png