js对象的继承

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
<script>

//继承 : 子类不影响父类,子类可以继承父类的一些功能 ( 代码复用 )

//属性的继承 : 调用父类的构造函数 call

//方法的继承 : for in :  拷贝继承 (jquery也是采用拷贝继承extend)

function CreatePerson(name,sex){   //父类
	this.name = name;
	this.sex = sex;
}
CreatePerson.prototype.showName = function(){
	alert( this.name );
};

var p1 = new CreatePerson(‘小明‘,‘男‘);
//p1.showName();

function CreateStar(name,sex,job){  //子类

	CreatePerson.call(this,name,sex);

	this.job = job;

}

//CreateStar.prototype = CreatePerson.prototype;

extend( CreateStar.prototype , CreatePerson.prototype );

CreateStar.prototype.showJob = function(){
};

var p2 = new CreateStar(‘黄晓明‘,‘男‘,‘演员‘);

p2.showName();

function extend(obj1,obj2){
	for(var attr in obj2){
		obj1[attr] = obj2[attr];
	}
}
</script>
</head>

<body>
</body>
</html>

  如上面的代码(此代码是视频资料中,自己也有写过一遍...)

js对象的继承要把属性和方法分开继承:

属性的继承 : 调用父类的构造函数 call

方法的继承 : for in : 拷贝继承 (jquery也是采用拷贝继承extend)

属性的继承直接调用父类的构造函数即可

Createperson(this,....);

方法的继承需要用到for  in

不能直接  子类.prototype = 父类.prototype 因为把父类的引用也传递给了子类.子类会影响父类

其他继承方式

1.类式继承

function Aaa(){}//父类

function Bbb(){}//子类

面试中可能会让我们用一句话来完成,Bbb.prototype = new Aaa();

但是这样还存在很多问题,例如Bbb的constructor指向问题。

正确做法应该是

function Bbb(){ Aaa.call(this); }

var F = function(){};
F.prototype = Aaa.prototype;
Bbb.prototype = new F();
Bbb.prototype.constructor = Bbb; //修正指向问题

2.原型继承,适用于非new创建的对象,

var a = {
name : ‘小明‘
};

var b = cloneObj(a);

b.name = ‘小强‘;

alert( b.name );
alert( a.name );

function cloneObj(obj){

var F = function(){};

F.prototype = obj;

return new F();

}

时间: 2024-11-23 05:01:14

js对象的继承的相关文章

JS 对象之继承

<!-- ————————JS对象之继承 ———————— --> //父类 function Sup(name){ this.name=name; } //父类的原型 Sup.prototype={ constructor:Sup, sayName:function(){ alert(this.name); } }; //子类构造函数 function Sub(age){ this.age=age; } //让子类的原型等于父类的实例 Sub.prototype=new Sup("

js对象和继承总结

创建对象方式: [工厂模式]:无法解决对象识别问题 [构造函数模式]:每个方法都要在每个实例上创建一遍 [原型模式]:原型上属性为引用类型的问题,见例子 [组合模式]:解决上述问题 [动态原型模式]:把所有信息封装在构造函数中,同时具备组合模式的优点. [寄生构造函数模式][稳妥构造函数模式] 继承方式: [原型链继承]:父类构造函数属性为引用类型的问题 (因为父类构造函数内的属性,即为子类原型上的属性),见例子 [借用构造函数继承]:父类原型上的方法无法被继承 [组合继承]:解决上述问题 [原

JS对象以及&quot;继承&quot;

javascript面向对象: * 函数   * Arguments对象:模拟函数重载   * 变量的作用域:     * 作用域:       * 全局域       * 函数域     * 变量的分类:       * 全局变量:全局域+函数域       * 局部变量:当前函数域     * 特殊情况:       * 定义局部变量时,不使用var:局部变量被自动定义为全局变量       * 当全局变量与局部变量同名时,在函数域中只能访问到局部变量 * 闭包   * 作用域链:变量的作用

关于js的对象原型继承

javascript中,对象的继承是通过原型去继承. 可以这样理解:js中的对象,包含的除了属性和方法,还有一个最基本的原型__proto__对象.这个原型__proto__指向谁,这个对象就继承谁.这是最容易理解对象原型继承的一种方式. 如下面的代码: var student={ name:'zhangsan', age:21, run:function(){ return this.name+' is running!'; } }; var xiaoming={ name:'xiaoming

JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实例化的的时候就不用对每个实例定义该属性方法,所有的实例均具有该方的引用见最后的输出. function Myclass(){ this.x=" x in Myclass"; this.get=function(){}//每次实例化对象,每个对象的该方法都是独立的,是不相同的 } Mycla

JS对象继承篇

JS对象继承篇 ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的 原型链 其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法 function Person(){ this.name = "Person"; } Person.prototype.getName = function(){ return this.name; }; function SuperPerson(name,sex){ this.name = name; this.sex

js最好的继承机制:用对象冒充继承构造函数的属性,用原型链继承 prototype 对象的方法。

js最好的继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法. function ClassA(sColor) { this.color = sColor; } ClassA.prototype.sayColor = function () { alert(this.color); }; function ClassB(sColor, sName) {//在 ClassB 构造函数中,用对象冒充继承 ClassA 类的 sColor 属性 ClassA.call(th

js 对象深复制,创建对象和继承

js 对象深复制,创建对象和继承.主要参考高级编程第三版,总结网上部分资料和自己的代码测试心得.每走一小步,就做一个小结. 1.对象/数组深复制 一般的=号传递的都是对象/数组的引用,如在控制台输入 var a=[1,2,3], b=a; b[0]=0; a[0] 此时显示的结果为0,也就是说a和b指向的是同一个数组,只是名字不一样罢了. 单层深复制: 1.js的slice函数: 返回一个新的数组,包含下标从 start 到 end (不包括该元素,此参数可选)的元素. 控制台输入: var a

JS对象继承的几种方式总结

今天学习了一下js的继承,js中的继承主要分四种,原型继承,构造函数继承,call/apply继承以及es6的extend继承.1.原型继承:原型继承主要利用js对象的prototype引用父类的构造函数来复制父类的方法. //定义一个Person类 function Person(name){ this.name=name; } //打招呼 Person.prototype.sayHello=function(){ alert("Hello,my name is "+this.nam