Javascript对象----继承

Javascript对象具有“自有属性”,也有一些属性是从原型对象继承而来的。为了更好地理解这种继承,必须更深入地了解属性访问的细节。

假设要查询对象o的属性x,如果o中不存在x,那么将会在o的原型对象中查询属性x。如果原型对象中也没有x,但这个原型对象也有原型,那么会继续在这个原型对象的原型上执行查询,直到找到X或者查找到一个原型是null的对象位置。可以看到,对象的原型属性构成了一个“链”,通过这个“链”可以实现属性的继承。

var o = {}     //o从object.prototype 继承对象的方法
o.x = 1;       //给o定义一个属性x,值为1
var p = inherit(o);   // p继承o和object.prototype
p.y = 2;       //给p定义一个属性y,值为2
var q = inherit(o);  // q继承p、o和object.prototype
q.z =3;        //给q定义一个属性z,值为3
var s = q.toString();   //toString继承自object.prototype
q.x + q.y     //结果是3,x和y分别继承自o和p

现在假设给对象o的属性x赋值,如果o中已经有属性x(这个属性不是继承来的),那么这个赋值操作只改变这个已有属性x的值。如果o中不存在属性x,那么赋值操作给o添加一个新属性x。如果之前o继承自属性x,那么这个继承的属性就被新创建的同名属性覆盖了。

属性赋值操作首先检查原型链,以此判定是否允许赋值操作。例如,如果o继承自一个只读属性x,那么赋值操作是不允许的。如果允许属性赋值操作,它也总是在原始对象上创建属性或对已有的属性赋值,而不会去修改原型链。

在Javascript中,只有在查询属性时才会体会到继承的存在,而设置属性则和继承无关,这是Javascript的一个重要特性,该特性让程序员有选择地覆盖继承的属性。

var unitcircle = { r : 1};     //一个用来继承的对象
var c = inherit(unitcircle);   //c继承属性r
c.x = 1; c.y = 1;             //c定义两个属性
c.r = 2;                      //C覆盖继承来的属性
unitcircle.r;                 //结果是1,原型对象没有修改

属性赋值要么失败,要么创建一个属性,要么在原始对象中设置属性,但有一个例外,如果o继承自属性x,而这个属性是一个具有setter方法的accessor属性,那么这时将调用setter方法而不是给o创建一个属性x。 需要注意的是,setter方法是由对象o调用的,而不是定义这个属性的原型对象调用的。因此如果setter方法定义任意属性,这个操作只是针对o本身,并不会修改原型链。

时间: 2024-08-04 03:57:08

Javascript对象----继承的相关文章

javascript对象继承

实现继承主要是依靠原型链来实现的 1.原型链 基本思想就是利用原型让一个引用类型继承另一个引用类型的属性和方法 1 function Parent(){ 2 this.surname = "li"; 3 } 4 Parent.prototype.getSurname = function(){ 5 return this.surname; 6 } 7 function Child(){ 8 this.name = "kai wen"; 9 } 10 Child.pr

JavaScript 对象继承

原型继承: 这种原型继承的特点:既继承了父类的模板,又继承了父类的原型对象.优点是继承了父类的模板,    又继承了父类的原型对象,缺点就是父类实例传参,不是子类实例化传参,不符合常规语言的写法. 1 function animal(footnum,eyescolor,feathercolor){ //夫类 2 this.foot = footnum; 3 this.eyes = eyescolor; 4 this.feather = feathercolor; 5 } 6 animal.pro

JavaScript对象继承的方法

写这个话题单纯是给自己做笔记了,不然老忘记. 第一种方法:     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) {

JavaScript对象 创建对象 继承

创建对象  --以下内容来自JavaScript高级程序设计 工厂模式 用函数来封装以特定接口创建对象的细节. function createPerson(name, age, job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); }; return o; } var person1 = createPerson("Nichola

JavaScript大杂烩4 - 理解JavaScript对象的继承机制

面向对象之继承 JavaScript是单根的面向对象语言,它只有单一的根Object,所有的其他对象都是直接或者间接的从Object对象继承(没有指定父类的对象,都被认为是从Object继承的). 在前面我们讨论了面向对象的封装性,在最后的地方也谈到了JavaScript的继承是通过原型和原型链实现的,下面我们就详细的展开这个问题:JavaScript到底是如何实现继承的? 继承的本质 继承的本质是重用,从语法上来讲,继承就是"D是B"的描述,其中B是基类,描述共性,D是子类,描述特性

JavaScript 对象的原型扩展(JS面向对象中的继承)

<script type="text/javascript"> function person(name, age) { this._name = name; this._age = age; var _self = this; this.say = function() { console.log(this._name + '-' + this._age); setTimeout(function() { console.log(_self._name); }, 2000

javascript对象创建及原型继承的研究

今天总结了下javascript关于原型继承和对象创建方面的东西,因为javascript的原型继承在使用传统面向对象语言开发的同学看来比较怪异,原型继承确实比传统OOP语言的继承理解和运用起来困难一些,当然个人觉得传统OOP的继承相对比较简单,因为中规中矩. 下面逐个的用示例说明javascript中对象创建方式,专业一点叫什么模式,主要有直接单个创建:工厂模式:提出方法类函数公用方式:构造函数模式:构造函数+原型方式:使用原型本质的方式构建(这种受过李站的<悟透javascript>一书的

JavaScript 的对象继承方式,有几种写法?

JavaScript 的对象继承方式,有几种写法? 一.对象冒充 其原理如下:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式).因为构造函数只是一个函数,所以可使 Parent 构造函数 成为 Children 的方法,然后调用它.Children 就会收到 Parent 的构造函数中定义的属性和方法.例如,用下面的方式定义 Parent 和 Children: 原理:就是把 Parent 构造函数放到 Children 构造函数里面执行一次.那为什么不直接执行,

javaScript 工作必知(七) 对象继承

对象继承inherit var o = { r: 1 }; var c = function f() { }; c.prototype = o; c.r = 3; alert(o.r);//被继承的属性值未发生改变. alert(c.r);//c中r覆盖了o中的属性.     如何调用o中的r属性呢. var o = { r: 1 }; var c = function f() { }; c.prototype = o; alert(o.r);//1 被继承的属性值未发生改变. alert(c.