问题描述
如题,在js中如果我想往String这个构造函数里面添加一个首字母大写的toInitialUpperCase方法,为什么人们要往String的prototype里面添加,String.prototype.toInitialUpperCase = function () { #code... }而不是向String本身添加呢?String.toInitialUpperCase = function () { #code... }如果在原型上面添加方法,感觉又要跑多一节原型链,还不如在本身上面加来得直接,那为什么还要在原型添加呢? 问题补充:好吧,应该是构造函数里"this"的问题。
解决方案
哥们javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用。 看下面的demo就明白了function baseClass(){this.showMsg = function(){ alert("baseClass::showMsg"); }}function extendClass(){}extendClass.prototype = new baseClass();instance = new extendClass();instance.showMsg(); // 显示baseClass::showMsg
解决方案二:
在本身添加会导致每次对象实例化时代码被复制,而在原型上添加相当于OO中在基类添加成员,子类实例化时可减少内存占用,也有利于代码的复用。关键还是看你添加的内容在对象层次中的复用范围
解决方案三:
其实往构造方法里面加方法是可以的,但是不够优雅,因为在new 每个string对象的时候,都会申请一块内存存放该方法,而如果是方法放在String的prototype中,则多有的string对象共用这个方法
解决方案四:
js调用某个方法,首先是在对象内部寻找方法,要是内部没有的话,则会到原型链上找,这样一直找下去,这样的也就达到了js的继承目的。