如题,在js中如果我想往String这个构造函数里面添加一个首字母大写的toInitialUpperCase方法,为什么人们要往String的prototype里面添加,
[code="js"]String.prototype.toInitialUpperCase = function () { #code... }[/code]
而不是向String本身添加呢?
[code="js"]String.toInitialUpperCase = function () { #code... }[/code]
如果在原型上面添加方法,感觉又要跑多一节原型链,还不如在本身上面加来得直接,那为什么还要在原型添加呢?
哥们
javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用。
看下面的demo就明白了
[code="javascript"]
function baseClass()
{
this.showMsg = function()
{
alert("baseClass::showMsg");
}
}
function extendClass()
{
}
extendClass.prototype = new baseClass();
instance = new extendClass();
instance.showMsg(); // 显示baseClass::showMsg[/code]
在本身添加会导致每次对象实例化时代码被复制,而在原型上添加相当于OO中在基类添加成员,子类实例化时可减少内存占用,也有利于代码的复用。
关键还是看你添加的内容在对象层次中的复用范围
其实往构造方法里面加方法是可以的,但是不够优雅,因为在new 每个string对象的时候,都会申请一块内存存放该方法,而如果是方法放在String的prototype中,则多有的string对象共用这个方法
因为如果将方法添加到构造函数自身的话,每次进行构造函数实例化都会给这个实例化对象添加该方法,那我们假设一下 如果传递不同的参数 方法是同样的 每次实例化是不是每次都要进行该方法的添加呢?那是不是需要开辟新的内存来存放该方法呢?那就造成开辟了很多个空间 存放的却是一模一样东西的一个结果 ,也就是造成【内存浪费】问题。
原型prototype的出现就是为了解决内存浪费的问题,原型的主要作用就是为了【共享方法】。
如果将方法定义在函数的原型上,那么每次传参只需要顺着原型链去找到该方法,这样每次实例化指向的方法地址都是同一个,就完美的解决了内存浪费问题。
下面是我个人总结的在原型上添加方法的模板:
构造函数名.prototype.方法名=function( ){
相同代码体
}
调用方式就是 对象名.方法名( )
一般情况下公共属性定义到构造函数中,公共的方法放到原型对象上。
js调用某个方法,首先是在对象内部寻找方法,要是内部没有的话,则会到原型链上找,这样一直找下去,这样的也就达到了js的继承目的。
往每一个实例上面去添加方法和属性是可以的 为了让其他实例也用上 符合面向对象编程思想