prototype属性
显性对象
1.所有javascript对象都有一个指向它的隐性原型对象的内部链接__prototype__,但只有函数对象才有prototype这个属性,当在方法原型中调用__prototype__时返回的是一端机器码(暂时不知道为什么,求大佬告知)
function test(){
console.log("test")
}
test.prototype.say=function(){
console.log("say my name")
}
console.log(test.prototype)//一个原型对象 {say: ƒ, constructor: ƒ}
console.log(test.__proto__)//ƒ () { [native code] }
隐性对象
在创建对象实例的时候,对象实例会创建一个隐式对象指向相应的函数的显示对象,在实验中的表现为:
function test(){
console.log("test")
}
test.prototype.say=function(){
console.log("say my name")
}
let b=new test()
console.log(a.__proto__) //{say: ƒ, constructor: ƒ}
console.log(test.prototype)//{say: ƒ, constructor: ƒ}
原型链
大概解释图
有上图可知:
栈空间testFunction地址内存贮着testFunction函数对象,而testFunction函数对象中有一个prototype属性这是函数对象的显示对象,这个显式对象指向一个Object实例对象,也就是testFunction函数的原型对象;而且tesFunction的实例对象有一个__proto__隐式对象也是指向testFunction的原型对象。最后test原型对象会指向最终的Object原型对象;里面存放着所有对象都能使用的函数和属性。原型链的作用也就是当一个对象调用方法属性的时候会顺着原型链一直往下找,这也就是为什么用户没有定义的属性和方法也能使用的原因
function testFunction(){
console.log(test)
}
console.log(testFunction.prototype)
一些补充的细节
在上面我们提到过函数对象的显示原型指向了一个Object实例对象,但从如下代码中我们发现:
function testFunction(){
console.log(test)
}
console.log(testFunction.prototype instanceof Object);
console.log(Array.prototype instanceof Object);
console.log(Function.prototype instanceof Object);
console.log(Object.prototype instanceof Object);
打印结果为:
我们发现上面出现了一个叛徒,那就是Object的显示原型打印出来并不是Object对象原因尚且不知 。愿大佬点播