关于prototype的一点疑惑

时间:2021-01-27 19:51:18
function TestClass(){
       this.property = true;
   }
   TestClass.prototype.getFatherValue = function(){
      return this.property;
   };
   var test = new TestClass();
   window.alert(test.prototype.getFatherValue());
   
问题:
 在TestClass的原型对象中添加了getValue()方法,为什么无法通过原型来访问这个方法(即test.prototype.getValue()无效),而只能通过test.getValue()来调用。小弟刚接触javascript,望各位大神指点。

6 个解决方案

#1


那你想让this指向哪阿?
function TestClass(){
       this.property = true;
   }
   TestClass.prototype.getFatherValue = function(){
      return this.property;
   };
   var test = new TestClass();
   window.alert(test.constructor.prototype.getFatherValue.call(test));

#2


this不是指向TestClass吗?上面的getValue()方法写错了,应该是getFatherValue()。prototype是test的原型,getFatherValue()在prototype中,按道理是可以通过test.prototype.getFatherValue()来访问的。

#3


用调试器吧。
只有用调试器才理的清。

#4


关于prototype的一点疑惑
举个简单的例子:TestClass是你师父,getFatherValue是你师父赚钱的能力。
你师父教会你赚钱的能力 test = new TestClass(); 但你不能直接去拿你师父的钱:test.prototype.getFaterValue,你得自己去拿钱。test.getFatherValue。而且根据js的规则,你想再找个徒弟,那需要经过多次的处理。一般叫继承。
这是一条js语法规则,这样做的目的,就是为了编程完全不能让实例化的对象test直接去改变父类的getFatherValue的方法。

这是我个人的理解,更管方的参考上面的图,或javascript高级程序设计 第三版 148页 理解原型对象。

#5


这里再次感叹一下,回答问题的不易。自己明白,想让别人明白,是需要化一点心思或时间来反推这个过程。如何站在别人的角度去让他明白这个原理是比较困难或有挑战性的。

#6


谢谢大家的指教,根据大家的答案和参考javascript高级程序设计,总结如下:
1.prototype属性是构造函数(TestClass())的属性,实例test没有prototype属性。
2.实例有一个指针[[prototype]]指向构造函数的prototype。
3.可以通过两种方法访问构造函数的prototype:通过test的proto属性和Object.getPrototypeOf(test)

#1


那你想让this指向哪阿?
function TestClass(){
       this.property = true;
   }
   TestClass.prototype.getFatherValue = function(){
      return this.property;
   };
   var test = new TestClass();
   window.alert(test.constructor.prototype.getFatherValue.call(test));

#2


this不是指向TestClass吗?上面的getValue()方法写错了,应该是getFatherValue()。prototype是test的原型,getFatherValue()在prototype中,按道理是可以通过test.prototype.getFatherValue()来访问的。

#3


用调试器吧。
只有用调试器才理的清。

#4


关于prototype的一点疑惑
举个简单的例子:TestClass是你师父,getFatherValue是你师父赚钱的能力。
你师父教会你赚钱的能力 test = new TestClass(); 但你不能直接去拿你师父的钱:test.prototype.getFaterValue,你得自己去拿钱。test.getFatherValue。而且根据js的规则,你想再找个徒弟,那需要经过多次的处理。一般叫继承。
这是一条js语法规则,这样做的目的,就是为了编程完全不能让实例化的对象test直接去改变父类的getFatherValue的方法。

这是我个人的理解,更管方的参考上面的图,或javascript高级程序设计 第三版 148页 理解原型对象。

#5


这里再次感叹一下,回答问题的不易。自己明白,想让别人明白,是需要化一点心思或时间来反推这个过程。如何站在别人的角度去让他明白这个原理是比较困难或有挑战性的。

#6


谢谢大家的指教,根据大家的答案和参考javascript高级程序设计,总结如下:
1.prototype属性是构造函数(TestClass())的属性,实例test没有prototype属性。
2.实例有一个指针[[prototype]]指向构造函数的prototype。
3.可以通过两种方法访问构造函数的prototype:通过test的proto属性和Object.getPrototypeOf(test)