问题描述
- 关于javascript原型对象的一些问题
-
如下一个原型对象:function Box(){} Box.prototype.name = 'Programmer'; Box.prototype.method = function(){ return this.name; }; var box = new Box();
1、box对象的原型属性__proto__访问的是原型对象prototype还是原型对象的constructor属性?
2、通过box.method()可以访问原型对象的method方法,通过box.__proto__.method()也可以访问,这两种方式的区别是什么?访问原型的属性和方法该用哪种方式?
3、构造函数Box的原型对象是Box.prototype吗?
4、原型对象存储在哪里?请细说一下详细的过程
5、实例对象的原型对象的__proto__指向哪里?如果存在这个对象,那么这个对象的__proto__又指向哪里?
6、构造函数Box的__proto__指向哪里?如果存在这个对象,那么这个对象的__proto__又指向哪里?
解决方案
- box.__proto__ == Box.prototype ; //true
- box.method = 12;
box.method == 12;//true;
box.__proto__.method == 12;//false;
box.__proto__.method = 1212;
box.method == 1212;//false;
box.method == 12;//true;
box.__proto__.method == 1212;//true
Box.prototype.method == 1212;//true
解决方案二:
Javascript 对象原型
javascript中的 对象 和 原型
JavaScript的原型对象
解决方案三:
1、实例化对象box的__proto__访问的是原型对象的prototype,原型对象的constructor属性指向Box()。
2、box.method()方法和box.__proto__.method()都访问method()的方法,区别是,box.method()方法首先会在box的实例属性中访问method方法,如果找不到,再访问Box.prototype。访问原型的属性和方法用box.__proto__,但这个__proto__属性不是ECMAScript标准化的属性,不是所有浏览器都支持。ECMAScript5标准化的方法为Object.getPrototypeOf()。
3、对象Box的原型对象为Box.prototype。
4、这个我不知道。
5、这个是继承中原型链的概念,如果原型对象的__proto__中,即Box.prototype中包含一个(或多个)属性为另一个对象(父对象),而父对象又有原型对象,那么Box原型对象的__proto__属性指向父对象的原型。
6、我认为,JS中,Box的构造函数是通过函数来实现的,根据JS原则,函数的作用域是一个封闭的子作用域,不同实例化对象通过构造函数实例化的属性被隔离成一个个封闭的作用域,不能直接互相访问。而原型是在全局作用域下定义的,所有的实例化对象访问的都是同一份原型属性,所以,我认为构造函数Box没有__proto__属性。