本文主要是介绍JS中的prototype和__proto__,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
prototype
在JS中,每一个函数都有一个prototype属性,它的作用,简单的理解,就是当使用new关键字实例化一个函数的时候,这个函数prototype里面的对象也会共享到新实例里面。
function M1(){name:'john'
}
M1.prototype.sex = 'male'
M1.age = 18
var m2 = new M1()
console.log(m2.name)//undefined
console.log(m2.sex)//male,因为sex在M1的prototype中,所以new出来的m2可以访问这个属性
console.log(m2.age)//undefined
其中,
M1.prototype.sex = 'male'
在M1的prototype属性中定义了sex,值是male,那么new M1()得到的实例m2,也具有了sex,并且值是male。
由于age属性没有定义在prototype上,所以m2无法访问。
M1.prototype.sex和M1.sex是不一样的,接着上面的代码:
proto
proto__是一个“指针”,它“指向”一个对象,上面的例子中,m2=new M1(),那么m2会自动具有__proto=M1.prototype。也可以手动修改__proto__,使它指向别的对象。
function M1(){name:'john'
}
var m2 = new M1()
m2.__proto__=M1
M1.sex = 'male'
console.log(m2.sex)//male
可以看到,sex直接定义在了M1上,而没在prototype中,m2仍然可以访问了。这是因为我们改写了__proto__,直接指向了M1对象。
__proto__不是js的标准规范里面的规定,各主流js引擎都支持,但不建议直接使用。
备注:
obj都有私有__proto__属性, 而函数是也是对象实例,所以函数也有__proto__
这篇关于JS中的prototype和__proto__的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!