您的位置:首页 > Web前端 > JavaScript

JavaScript精华知识之继承部分

2017-07-13 19:47 211 查看

伪类

JavaScript通过构造器函数来产生对象,实现继承。当一个函数被创建时,Function构造器产生的函数对象会运行类似于这样的代码:

this.prototype = {constructor: this}; //该函数的原型对象会产生一个构造属性,并指向该函数。

原型属性/对象:当一个新函数被创建时,会根据某个机制赋于该函数一个prototype属性,这个属性指向新函数的原型对象。该原型对象中有一个consturctor属性,这个属性指向prototype属性所在的对象中(也就是这个新函数)。这个prototype对象(原型对象)是存放继承特征的地方。因为JavaScript没有一个方法用于确定哪个函数是打算用来做构造器的。

当采用构造器调用模式时,即使用new关键字去调用一个函数时,函数执行的方式会被修改。如果new是一个方法而不是一个运算符时,它可能会这样执行:

Function.methos("new", function () {
//新创建一个对象,它继承了构造器的原型对象。
var that = Object.create(this.prototype); //此时,this是指向Function构造器的。
//调用构造器,绑定this对象到新对象that上
var other = this.apply(that, argument); //此时,this对象指向that对象。
//如果它的返回值不是一个对象,就返回新的对象。
return (typeof other === "object" && other) || that;
});

以上代码,也可以说明在调用new关键字时,发生了什么事,或者说是调用new关键字创建的新对象经历了哪些步骤后拥有了函数的特性。

我们可以举例,定义一个构造器并扩展它的原型对象:

var Mammal = function (name) {
this.name = name;
};
Mammal.prototype.getName = function () {
return this.name;
};
Mammal.prototype.says = function () {
return this.saying || "";
};

//调用new关键字定义一个它的实例对象
var myMammal = new Mammal("Tom");
var name = Mammal.getName();
console.log(name); //Tom


下面可以定义另一个构造器来继承Mammal对象的属性和方法。实现原理:将新构造器的prototype替换了Mammal的实例对象即可。

//定义一个新的构造函数
var Cat = function (name) {
this.name = name;
this.saying = "meow";
};

//替换Cat对象的原型对象为 Mammal的实例对象
Cat.prototype = new Mammal(); //这样就实现了继承

//扩展Cat对象的原型对象,增加purr和getName方法
Cat.prototype.purr = function (n) {
var i, s = "";
for (i = 0; i < n; i++) {
if (s) {
s += "-";
}
s += "r";
}
return s;
};

Cat.prototype.getName = function () {
return this.says() + " " + this.name;
};

//创建Cat构造函数的一个实例
var myCat = new Cat("my nane is Tom");
var says = myCat.says(); //meow
console.log(says);
var purr = myCat.purr(6); //r-r-r-r-r
console.log(purr);
var name = myCat.getName();
console.log(name); //my name is Tom


对象说明符

有时候,构造器需要接收一大串参数。但这样就很难记住参数的顺序/所代表的意义,在这种情况下,如果在编写构造器时让它接受一个简单的对象说明符,这样可能更加容易记住参数的顺序。

比如:创建一个对象

var myObject = maker(f, l, m, c, s);


还不如创建更容易理解:

var myObject = maker(
first : f,
middle : m,
last : l,
state : s,
city : c
);


现在多个参数可以按任何顺序排列。对象说明符可以让对象包含将要创建的对象的规格说明。也就是某参数代表着什么意思。

原型

基于原型对象的继承比基于伪类的继承更为简单:一个新对象可以继承一个旧对象的属性和方法。先构造一个有用的对象,接着可以构造更多与这个对象类似的对象。

首先,构造一个有用的对象:

var myMammal = {
name : "Tom",
getName : function () {
return this.name;
},
says : function () {
return this.saying || "";
}
};


接着可以使用Object.create()方法来构造多个与myMammal对象类似的对象:

var myCat = Object.create(myMammal);
console.log(myCat.name);
myCat.name = "Bob";
console.log(myCat.getName);
myCat.saying = "meow";

console.log(myCat.saying);


通过Object.create()方法,使myCat对象继承了myMammal对象的属性和方法,同时也可以为myCat对象重新定义属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: