js中使用prototype来实现方法的原因
1、在js中实现方法
function one(){
//方法内容
}
可以如此实现,只不过如此实现的方法,相当于创建了一个新的全局变量。
等同于:
var one = function(){
//方法内容
}
如何使自己的方法不声明为全局变量呢?
我们需要将方法保存在对象中,只暴露出全局对象,隐藏对象的方法。
var oneObj = {
one:function(){
//方法内容
}
}
//使用方法
oneObj.one();
因为在JavaScript中,函数也是对象。所以我们可以这样写:
var oneObj = function(){};
oneObj.one = function(){
//方法内容
}
上面的内容实现了,方法在不暴露为全局变量,但是当别人使用你的方法时,或者别人像拷贝出一份你的对象,使用你的方法时,是不可以的。因为新对象是不能继承这些方法的。
复制的作用:你买了一本书,你的小伙伴想要,如果你有一台打印机,你就可以打印给你的小伙伴
如果是指向单单的复制,可以将方法放在一个函数对象中:
var oneObj = function(){
return {
one:function(){
//实现内容
}
}
};
当每次调用函数时,就会返回一个新的对象,我们写的方法就在对象中。
我们虽然完成了简单的返回,但这不是我们想要的类,因为创造出的对象和oneObj没有任何关系,需要改造下:
var oneObj = function(){
this.one = function(){
//实现内容
}
};
上面的对象就可以看做是个类,可以使用new关键字进行创建。
但是存在一个问题,如果创建多个oneObj,新创建的对象都会对类的this上的属性进行复制,所以这些新创建的对象都有一套属于自己的方法。有是有这么做会造成很大的消耗。我们需要继续优化
var oneObj = function(){};
oneObj.prototype.one = function(){
//方法内容
}
oneObj.prototype.two = function(){
//方法内容
}
/***********************上述的方法也可以写作*******************/
var oneObj = function(){};
oneObj.prototype = {
one:function(){
//实现内容
},
two:function(){
//实现内容
},
}
这样创建对象实例的时候,创建出来的对象拥有的方法就都是一个了,因为他们都需要依赖prototype原型依次寻找,而找到的方法都是同一个,他们都绑定在oneObj对象类的原型上。
注意:上述的两种对prototype赋值的方法不能混用
如果我们使用的话
var oj = new oneObj()
oj.two();
oj.one();
我们调用两个方法,对象写了两遍,该如何使用链式调用呢?就需要在每个方法的结尾将当前的对象进行返回。在JavaScript中this的指向就是当前对象。所以可以将this返回
var oneObj = function(){};
oneObj.prototype = {
one:function(){
//实现内容
return this;
},
two:function(){
//实现内容
return this;
},
}
//在使用的时候我们就可以链式调用
var oj = new oneObj();
oj.one().two();
函数的祖先
prototype.js是一款js的框架,可以看看
如果想给每一个函数都添加一个方法:
Function.prototype.one = function(){
//
}
//如果习惯函数的形式
var f = funtion(){};
f.one();
//如果习惯类的形式
var f = new Function();
f.one();