先上图:
如图,我使用构造函数Cat创建了一个cat1对象,书上说每个对象都有一个prototype属性指向一个对象,这个对象叫做原型对象,每个对象都会从它的原型对象上继承属性。我的问题是:为啥cat1的prototype属性是undefined呢?cat1的toString方法是从哪里继承的呢?
先上图:
如图,我使用构造函数Cat创建了一个cat1对象,书上说每个对象都有一个prototype属性指向一个对象,这个对象叫做原型对象,每个对象都会从它的原型对象上继承属性。我的问题是:为啥cat1的prototype属性是undefined呢?cat1的toString方法是从哪里继承的呢?
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()
方法。
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
应该是每一个函数都会有一个
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
的属性,这样就实现了属性的重载。