详解JavaScript中基于原型prototype的继承特性_

上传人:cn****1 文档编号:470097214 上传时间:2023-08-11 格式:DOCX 页数:7 大小:13.33KB
返回 下载 相关 举报
详解JavaScript中基于原型prototype的继承特性__第1页
第1页 / 共7页
详解JavaScript中基于原型prototype的继承特性__第2页
第2页 / 共7页
详解JavaScript中基于原型prototype的继承特性__第3页
第3页 / 共7页
详解JavaScript中基于原型prototype的继承特性__第4页
第4页 / 共7页
详解JavaScript中基于原型prototype的继承特性__第5页
第5页 / 共7页
点击查看更多>>
资源描述

《详解JavaScript中基于原型prototype的继承特性_》由会员分享,可在线阅读,更多相关《详解JavaScript中基于原型prototype的继承特性_(7页珍藏版)》请在金锄头文库上搜索。

1、详解JavaScript中基于原型prototype的继承特性_ 这篇文章主要介绍了详解JavaScript中基于原型prototype的继承特性,JavaScript中缺少类等面对对象的重要特性,因而谈到继承也显得非常古怪.需要的伴侣可以参考下 JavaScript 中的继承比较奇葩,无法实现接口继承,只能依靠原型继承。 原型链 原型就是一个对象,通过构造函数创建出来的实例会有指针指向原型得到原型的属性和方法。这样,实例对象就带有构造函数的属性方法和原型的属性方法,然后将需要继承的构造函数的原型指向这个实例,即可拥有这个实例的全部属性方法实现继承。 看下面演示代码: /声明超类,通过构造函数

2、和原型添加有关属性和方法 function Super() this.property = true; Super.prototype.getSuperValue = function() return this.property; ; /声明子类的构造函数 function SubType() this.subproperty = false; /将子类的原型指向超类的实例,得到超类的一切 SubType.prototype = new Super(); SubType.prototype.constructor = SubType; SubType.prototype.getSubValu

3、e = function() return this.subproperty; ; /由子类创建对象,测试是否继承超类方法和属性 var instance = new SubType(); console.log(instance.getSuperValue(); 全部函数的默认原型都是 Object 的实例,因此默认原型都会包含一个内部指针,指向 Object.prototype。 用法 instanceof 和 isPrototypeOf 可以确定原型和实例的关系: instance instanceof Object; Object.prototype.isPrototypeOf(ins

4、tance); 用法原型链的时候,需要谨慎的定义方法。子类需要重写超类型的某个方法或者扩充,肯定要放在替换原型的语句后面,这样才能生效。此外,通过原型链实现继承时,不能用法对象字面量创建原型方法,这样会重写原型链: . SubType.prototype = new Super(); SubType.prototype = . ; 这会更换指针指向新对象,从而重写了原型链。 原型链的继承方法是有缺陷的,主要有两个问题: 1,来自包含引用类型值的原型,会被全部实例共享。 前面文章介绍过包含引用类型值的原型属性会被全部实例共享,一个实例修改,其他实例会随之转变,因此需要在构造函数中定义属性。而原型

5、链继承的时候,无论超类中属性是在构造函数还是原型中定义,全部都变成了实例对象被子类继承,从而对子类的实例产生影响。 2,创建子类型的实例时,不能向超类型的构造函数中传递参数。 原型链的继承,挺直将子类原型指向超类的实例,这时候可以向超类传递参数。但是当子类创建实例的时候,只能向子类的构造函数传递参数,而不能向超类的构造函数传递参数。 因此实际应用中,很少单独用法原型链。 相关的一些代码实践 鉴别一个原型属性 function hasPrototypeProperty(object, name) return name in object !object.hasOwnProperty(name)

6、; 在构造函数中用法原型对象 function Person(name) this.name = name; Person.prototype = constructor: Person, sayName: function () console.log(this.name); , toString: function() ; var person1 = new Person(Nicholas); var person2 = new Person(Greg); console.log(person1 instanceof Person); / true console.log(person1.

7、constructor = Person); / true console.log(person1.constructor = Object); / false console.log(person2 instanceof Person); / true console.log(person2.constructor = Person); / true console.log(person2.constructor = Object); / false 对象继承 var person1 = name: Nicholas, sayName: function () console.log(thi

8、s.name); ; var person2 = Object.create(person1, name: configurable: true, enumerable: true, value: Greg, writable: true ); person1.sayName(); / Nicholas person2.sayName(); / Greg console.log(person1.hasOwnProperty(sayName); / true console.log(person1.isPropertyOf(person2); / true console.log(person2

9、.hasOwnProperty(sayName); / false 模块模式 var person = (function () var age = 25; function getAge() return age; function growOlder() age+; return name: Nicholas, getAge: getAge, growOlder: growOlder ; (); 作用域的构造函数 function Person(name) this.name = name; Person.prototype.sayName = function() console.log(this.name); ; var person1 = Person(Nicholas); console.log(person1 instanceof Person); / false console.log(typeof person1); / undefined console.log(name); / Nicholas .

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号