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对象重新定义属性。
相关文章推荐
- JavaScript精华知识之对象部分
- Java培训实战教程之Java基础知识精华部分(六)-继承
- JavaScript精华知识之语法部分
- JavaScript精华知识之函数部分
- JavaScript基础-对象、继承、传值/址基本知识实践
- 前端重点知识整理(JavaScript)四:对象及继承
- javascript基础知识精华笔记汇总
- 讲述Javascript 实现继承的方式(基础知识)
- JavaScript中DOM部分知识汇总
- javascript中BOM部分基础知识总结
- Javascript基础知识盲点总结——继承
- Javascript基础知识盲点总结——继承
- Java培训实战教程之Java基础知识精华部分(四)-封装
- Javascript知识精华
- Java培训实战教程之Java基础知识精华部分(五)-设计模式
- Java培训实战教程之Java基础知识精华部分(一)
- 《javascript 语言精粹》精华部分
- Javascript知识精华(zhuan)
- javascript基础知识复习2-javascript的继承
- Java培训实战教程之Java基础知识精华部分(三)