扫码关注官方订阅号
先上图:
如图,我使用构造函数Cat创建了一个cat1对象,书上说每个对象都有一个prototype属性指向一个对象,这个对象叫做原型对象,每个对象都会从它的原型对象上继承属性。我的问题是:为啥cat1的prototype属性是undefined呢?cat1的toString方法是从哪里继承的呢?
应该是每一个函数都会有一个prototype对象,每个对象(除了Object.prototype)都有个私有属性,原则上不可以用js访问。(看你用chrome)在chrome这个属性是__proto__,这个属性就是cat1.__proto__ === Cat.prototype。所以应该是每个对象都有一个__proto__,这个属性指向构造函数的prototype。继承是说,当我们读取 cat1 的某个属性,那么程序首先查找 cat1 有没有这个属性,如果有就是这个属性。否则就看 cat1.__proto__ 也就是Cat.prototype有没有这个属性,如果有就是这个属性。如果没有就查找cat1.__proto__.__proto__有没有这个属性。。。一直这样找下去,直到Object.prototype。这样就实现了 cat1从Cat.prototype继承属性,当然是只读的。如果cat1定义了一个相同的属性,从上面看出,访问的就是cat1的属性,这样就实现了属性的重载。
prototype
__proto__
cat1.__proto__ === Cat.prototype
cat1.__proto__
Cat.prototype
cat1.__proto__.__proto__
Object.prototype
cat1
建议你搜一下相关文章 了解下__proto__、prototype、constructor的区别
cat1.__proto__ === Cat.prototype; console.log(Cat.prototype); // object Cat.prototype.__proto__ === Object.prototype; console.log(typeof Object.prototype.toString) // function
cat1并没有定义prototype,所以为undefined,cat1通过原型链一路找到Object.prototype,而Object.prototype含有toString()方法。
undefined
toString()
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
应该是每一个函数都会有一个
prototype
对象,每个对象(除了Object.prototype)都有个私有属性,原则上不可以用js访问。(看你用chrome)在chrome这个属性是__proto__
,这个属性就是cat1.__proto__ === Cat.prototype
。所以应该是每个对象都有一个
__proto__
,这个属性指向构造函数的prototype
。继承是说,当我们读取 cat1 的某个属性,那么程序首先查找 cat1 有没有这个属性,如果有就是这个属性。否则就看
cat1.__proto__
也就是Cat.prototype
有没有这个属性,如果有就是这个属性。如果没有就查找cat1.__proto__.__proto__
有没有这个属性。。。一直这样找下去,直到Object.prototype
。这样就实现了
cat1
从Cat.prototype
继承属性,当然是只读的。如果cat1
定义了一个相同的属性,从上面看出,访问的就是cat1
的属性,这样就实现了属性的重载。建议你搜一下相关文章 了解下__proto__、prototype、constructor的区别
cat1
并没有定义prototype
,所以为undefined
,cat1
通过原型链一路找到Object.prototype
,而Object.prototype
含有toString()
方法。