JavaScript新手,正看《Pro JavaScript Techniques》,有些疑惑
function Person( name ) {
this.name = name;
}
// 给Person对象增加getName方法
Person.prototype.getName = function() {
return this.name;
};
function User( name, password ) {
this.name = name;
this.password = password;
};
// User的原型设置为Person对象
User.prototype = new Person();
//书上前后出现过两种注释:1、为User对象增加getPassword方法
//2、为User对象的原型对象增加getPassword方法,哪一种注释是对的?
User.prototype.getPassword = function() {
return this.password;
};
User.func = function (){
//书中称这样写的方法是“静态方法”(Static Methods),具体是什么意思?
}
var PP=new Person("PP"); //PP是Person的复制品吗?new都干了什么?
aler t(PP.getPassword()); //调用失败。Person对象没有getPassword方法?
javascript中的继承是一种基于原型(prototype)的集成。任何function 对象都有一个属性叫prototype,可以来定义这个function对象的原型。
对于:
function Person( name ) {
this.name = name;
}
// 给Person对象增加getName方法
Person.prototype.getName = function() {
return this.name;
};
这段代码,你可以这样理解:你完全可以在function Person()内部定义一个this.getName = function(){....}的方法,
function Person( name ) {
this.name = name;
this.getName = function(){return this.name;}
}
当你在new Person的时候,js engine就会为这个对象分配内存,包括name和getName都会分配,如果我new了n个Person的话,势必造成资源的浪费,因为每个对象都有getName这个方法,而实际上他们都做相同的工作,要是能让他们都指向同一个函数(同一块内存地址)就好了。原型继承就很好的解决了这个问题。当你定义Person.prototype.getName以后,在调用(new Person()).getName时候,会发生一种链式查找,首先查找本对象有没有getName,没有的话就到他的原型里面去查找,如果他的原型里也没有的话就到原型的原型去查找,知道找到这个方法。如果一直查找,直到找到Object.prototype(任何对象的“基类”)还是没有找到的话,就会返回undefined。你可以用obj.hasOwnProperty()这个函数查看你当前的属性或者方法是否来自对象本身还是来自于他的原型(对 function来说)。这也解释了为何
User.prototype = new Person();
User.prototype.getPassword = function() {
return this.password;
};//上一行的new Person()增加了一个getPassword,但是Person.prototype并没有变化
var PP=new Person("PP");
aler t(PP.getPassword()); //调用失败。PP没有定义getPassword这个方法,同样Person.prototype也没有这个方法。你可以这样试试:
function Person(name){
this.name = name;
}
Person.prototype.getName = function(){
return this.name;
}
function User(name,pass){
this.name = name;
this.pass = pass;
}
var p = new Person('liu');
User.prototype = p;
User.prototype.getPassword = function(){
return this.pass;
}
var u = new User('wang','xxx');
alert(p.getPassword);
alert(u.getPassword());
alert(p.getPassword == u.getPassword)
至于静态方法,你可以这样理解。function虽然是函数类型,但是也是Object类型,是Object类型的话就会有属性或方法。如:
var obj = {};
obj.method = function(){alert('obj ok');}
function func1(){}
func1.method = function(){alert('func1 ok');}
如果你对func1那里还有疑惑,那么这样看看是不是就和obj一样了呢?
var func1 = function(){}//定义一个函数对象
func1.method = function(){alert('func1 ok');}
肯定没有了 getPassword是他子类的方法 ,父类肯定用不了,你还是在看看js的继承吧