写这个话题单纯是给自己做笔记了,不然老忘记。 第一种方法: function fn1(x) { this.x = x; } function fn2(x, y) { this.tmpObj = fn1; this.tmpObj(x); delete this.tmpObj; this.y = y; } 第二种方法:call()或apply() function fn1(x) { this.x = x; } function fn2(x, y) { fn1.call(this, x); this.y = y; } 第三种...
1. 对象冒充 对象冒失是在函数环境中使用this关键字后发展出来的一种继承方式。其原理如下:构造函数使用this关键字给所有属性和方法赋值(即采用类声明的构造函数方式)。因为构造函数只是一个函数,所以可使ClassA的构造函数成为ClassB的方法,然后调用它。ClassB就会收到ClassA的构造函数中定义的属性和方法。例如,用下面的方式定义ClassA和ClassB: function ClassA (sColor) { this.color = sColor; ...
一.两个原型 很多人都知道javascript是原型继承,每个构造函数都有一个prototype成员,通过它就可以把javascript的继承演义的美轮美奂了.其实啊,光靠这一个属性是无法完成javascript的继承.我们在代码中使用的prototype完成继承在这里就不多说了.大家可以查一下资料.另外一个看不见的prototype成员.每一个实例都有有一条指向原型的prototype属性,这个属性是无法被访问到的,当然也就无法被修改了,因为这是维护javascript继承的...
我们知道继承是oo语言中不可缺少的一部分,对于JavaScript也是如此。一般的继承有两种方式:其一,接口继承,只继承方法的签名;其二,实现继承,继承实际的方法。JavaScript不支持签名,因此只有实现继承。其中实现继承主要是依赖于原型链的。下面我将以原型链为重点说说继承的几种主要的方式:原型链继承借用构造函数继承组合继承(重点)第一部分:原型链继承 A 要说原型链继承,不得不首先介绍一下原型链的概念。 想象...
本文是JavaScript The Good Part 有关对象和继承的学习笔记。1. Object.create本函数是ECMAScript 5中的标准函数,其作用是用一个对象作为原型来生成另一个对象,可以用以下的code 模拟实现。 if(typeof Object.create !== ‘function‘) {Object.create = function(proto){var F = function(){};if(typeof proto !== ‘object‘){//Follow the chrome error pattern.thrownew TypeError(‘Object prototype may only be an Ob...
作者: 阮一峰日期: 2010年5月24日这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现"继承"。今天是最后一个部分,介绍不使用构造函数实现"继承"。一、什么是"非构造函数"的继承?比如,现在有一个对象,叫做"中国人"。 var Chinese = { nation:‘中国‘ };还有一个对象,叫做"医生"。 var Doctor ={ career:‘医生‘ }请问怎样才能让"医生"去继承"中国人",也就是说,我怎样才能生成一...
前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承。开宗明义,继承是指在原有对象的基础上,略作修改,得到一个新的对象。javascript主要包括类式继承、原型继承和拷贝继承这三种继承方式。本文是javascript面向对象系列第三篇——实现继承的3种形式 类式继承 大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,如new和instanceof。...
//经典继承:已知一个对象obj,现在要创建另外一个对象newObj,对象newObj要继承obj的所有方法和属性//分析:1.newObj.__proto__=obj 2.创建对象除了字面量的方式就是使用构造函数的方式function create(){functionFun(){};Fun.prototype=obj;returnnewFun();}//ES5中Object.create(obj) (IE9版本以上才支持)//封装一个方法兼容个版本浏览器都能执行Object.create的方法if(typeofObject.create !==‘function‘){//判断当前浏览器是否...
原型链: 构造函数中都有一个prototype属性指针,这个指针指向原型对象,而创建的实例也有指向这个原型对象的指针__proto__。当实例查找方法时先在实例上找,找不到再通过__proto__到原型对象上查找。如果原型对象是另一个类型的实例,那么原型对象包含一个指向另一个原型对象的指针、另一个原型对象中也包含指向另一个构造函数的指针。原型连继承function superValue(){this.superValue = "superValue"; }superValue.prototype...
在js中,关于继承只有利用构造函数和原型链两种来现实。以前所见到的种种方法与模式,只不过是变种罢了。借用构造函数?123456789101112131415161718192021// 一个动物类,包含名字和性别属性functionAnimal (name, sex) { this.name = name; this.sex = sex; this.getName = function(){ returnthis.name; }; } // Cat类继承Animal基类,并且拥有额外的属性functionCat (name, sex, hasLegs) { ...
理解原型链在 JavaScript 的世界中,函数是一等公民。上面这句话在很多地方都看到过。用我自己的话来理解就是:函数既当爹又当妈。“当爹”是因为我们用函数去处理各种“粗活累活”(各种工具函数、页面交互、业务逻辑等);“当妈”是因为函数还会“生孩子”(创建对象)。在 JavaScript 的世界中,每一个对象都有一个隐藏的__proto__属性。这个属性指向生成这个对象的构造函数的原型(prototype)。事实上,所有函数都有一个原型。...
向所有的面向对象语言一样,js也拥有继承特性,然而不像大多数OO(Object-Oriented)语言一样,JS只有实现继承,没有接口继承。那么,原型链便起到了决定性的作用。 在ECMAScript中,原型链是实现继承的主要方法。其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。其关键步骤便是让一个函数的原型对象成为另一个函数的实例。(理解可能有错,欢迎指正,一起学习)。 以下段代码来理解function GrandFather(){...
什么叫非构造函数的继承?比如,现在有一个对象,叫做"中国人"。 var Chinese = { nation:‘中国‘ };还有一个对象,叫做"医生"。 var Doctor ={ career:‘医生‘ }请问怎样才能让"医生"去继承"中国人",也就是说,我怎样才能生成一个"中国医生"的对象?这里要注意,这两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"。二、object()方法object()函数,可以做到这一点。 functio...
面向对象编程很重要的一个方面,就是对象的继承。A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法。这对于代码的复用是非常有用的。大部分面向对象的编程语言,都是通过“类”(class)实现对象的继承。传统上,JavaScript 语言的继承不通过 class,而是通过“原型对象”(prototype)实现,本章介绍 JavaScript 的原型链继承。ES6 引入了 class 语法,基于 class 的继承不在这个教程介绍,请参阅《ES6 标准入门》一书...
经典继承借用构造函数,子类型构造函数内部调用超类型构造函数function SuperType(){ this.colors = ["red","blue","green"]; }function SubType(){ SuperType.call(this); //继承了SuperType}var instance1 = new SubType();instance1.colors.push("black");alert(instance1.colors); //"red,blue,green"var instance2 = new SubType();alert(instance1.colors); //"red,blue,green" 组合继承将原型链和借用构造...