前言

JS 是没有继承的,不过可以曲线救国,利用构造函数、原型等方法实现继承的功能。

 var o=new Object();

其实用构造函数实例化一个对象,就是继承,这里可以使用Object中的所有属性与方法。那么为什么能访问Object对象的方法,其实访问的是其原型对象的方法,所有的方法都是放在原型中而不是类中。

 console.log(o.__proto__ === Object.prototype) // true  继承的本质
console.log(o.__proto__ === Object);
console.log(Object.__proto__ === Function.prototype);
console.log(Function.prototype.__proto__ === Object.prototype);
console.log(Number.__proto__ === Function.prototype);

object是万物祖先,Everything is object 嘛。

1、内置对象都继承自object

 var myNumber = new Number(10); //实例化一个数字对象

字符串对象,其实是String对象的一个实例化

 var s = ‘str’;

除了可以访问自身属性方法,还能访问父类属性方法

 console.log(s.toUpperCase());
console.log(s.toString());

2、自定义对象的继承

 // 父类
var Person = function(){
this.name='AV老师';
this.test='测试中的毕福剑';
}
Person.prototype={
say:function(){
console.log('呀买碟');
}
}
// 构造函数
var Canglaoshi = function(name,age,cup){
this.name=name;
this.age=age;
this.cup=cup;
}
// 继承person,则拥有person原型中的方法
Canglaoshi.prototype=new Person();
Canglaoshi.prototype.ppp=function(){
console.log('啪啪啪');
}
// 苍老师拥有了person中的方法
var xiaocang=new Canglaoshi('空空',18,'E');
xiaocang.say();
console.log(xiaocang.name);
console.log(xiaocang.age);
console.log(xiaocang.cup);
console.log(xiaocang.test);

3、自定义对象继承的原型链演示

 +(function() {
//父类
function SuperParent() {
this.name = 'mike';
} //子类继承父亲 - 二次继承:
function Parent() {
this.age = 12;
}
Parent.prototype = new SuperParent(); //通过原型,形成链条 var parent = new Parent();
console.log("测试父亲可以访问爷爷属性:" + parent.name);
console.log("测试父亲可以访问自己的属性:" + parent.age); //继续原型链继承 - 三次继承
function Child() { //brother构造
this.weight = 60;
}
Child.prototype = new Parent(); //继续原型链继承 //原型链测试2
//儿子集成爷爷
var child = new Child();
console.log("测试儿子可以访问爷爷的属性:" + child.name); //继承了Parent和Child,弹出mike
console.log("测试儿子可以访问父亲的属性:" + child.age); //弹出12
console.log("测试儿子可以访问自己独特的属性:" + child.weight); //弹出12 //原型链测试
//爷爷可以访问Object中的方法
var test = new SuperParent();
console.log(test.name);
console.log(test.toString());
//访问链: SuperParent构造对象--》SuperParent原型对象--》Object对象--》Obect原型对象(找到toString方法)--》null console.log(child.name);
//原型链:首先访问Child构造函数,发现没有name属性--》寻找__proto__,判断起指针是否为空--》指向Child原型函数,寻找有没有name属性--》
//---》没有找到,则判断其__proto__属性是否为null,如果不为null,继续搜索--》找到parent对象,检查是否有name属性,没有。。。。
})()

4、构造函数继承

 +(function() {
function People() {
this.race = '人类';
}
People.prototype = {
eat: function() {
alert('吃吃吃');
}
} /*人妖对象*/
function Shemale(name, skin) {
People.apply(this, arguments); // 用call也是一样的,注意第二个参数
this.name = name;
this.skin = skin;
}
//实例化
var zhangsan = new Shemale('张三', '黄皮肤')
console.log(zhangsan.name); //张三
console.log(zhangsan.skin); //黄皮肤
console.log(zhangsan.race); //人类
})()

5、组合继承

 +(function() {
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.say = function() {} function Man(name, age, no) {
/*会自动调用Person的方法,同时将name age传递过去*/
Person.call(this, name, age);
//自己的属性
this.no = no;
}
Man.prototype = new Person(); var man = new Man("张三", 11, "0001");
console.log(man.name);
console.log(man.age);
console.log(man.no);
})()

6、拷贝继承

 <script>
+(function() {
var Chinese = {
nation: '中国'
};
var Doctor = {
career: '医生'
};
// 请问怎样才能让"医生"去继承"中国人",也就是说,我怎样才能生成一个"中国医生"的对象?
// 这里要注意,这两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"。
function extend(p) {
var c = {};
for (var i in p) {     
c[i] = p[i];    
}
c.uber = p;
return c;
}
var Doctor = extend(Chinese);
Doctor.career = '医生';
alert(Doctor.nation); // 中国
})()
</script>

7、寄生组合继承

 <script>
+(function() {
/*继承的固定函数*/
function inheritPrototype(subType, superType) {
var prototype = Object(superType.prototype);
prototype.constructor = subType;
subType.prototype = prototype;
} function Person(name) {
this.name = name;
}
Person.prototype.say = function() {} function Student(name, age) {
Person.call(this, name);
this.age = age;
} inheritPrototype(Student, Person);
var xiaozhang = new Student('小张', 20);
console.log(xiaozhang.name)
})()
</script>

8、使用第三方框架实现继承

  <script src='simple.js'></script>
<!-- 使用的第三方框架simple.js -->
<script>
+(function() { < script >
var Person = Class.extend({
init: function(age, name) {
this.age = age;
this.name = name;
},
ppp: function() {
alert("你懂的");
}
});
var Man = Person.extend({
init: function(age, name, height) {
this._super(age, name);
this.height = height;
},
ppp: function() {
/*调用父类的同名方法*/
this._super();
/*同时又可以调用自己的方法*/
alert("好害羞 -,- ");
}
}); var xiaozhang = new Man(21, '小张', '121');
xiaozhang.ppp();
})()

浅谈JS中的继承的更多相关文章

  1. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  2. 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂

    浅谈JS中的!=.== .!==.===的用法和区别   var num = 1;     var str = '1';     var test = 1;     test == num  //tr ...

  3. 浅谈JS中 var let const 变量声明

    浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...

  4. 浅谈js中继承的理解和实现

    一.前言 java.C#等正统面向对象语言都会提供类似extend之类的处理类的继承的方法,而javascript并没有提供专门的方法用于继承,在javascript中使用继承需要一点技巧.js中实例 ...

  5. 由项目浅谈JS中MVVM模式

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.    背景 最近项目原因使用了durandal.js和knock ...

  6. js架构设计模式——由项目浅谈JS中MVVM模式

    1.    背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...

  7. 浅谈JavaScript中的继承

    引言 在JavaScript中,实现继承的主要方式是通过原型链技术.这一篇文章我们就通过介绍JavaScript中实现继承的几种方式来慢慢领会JavaScript中继承实现的点点滴滴. 原型链介绍 原 ...

  8. 浅谈JS中的高级函数

    在JavaScript中,函数的功能十分强大.它们是第一类对象,也可以作为另一个对象的方法,还可以作为参数传入另一个函数,不仅如此,还能被一个函数返回!可以说,在JS中,函数无处不在,无所不能,堪比孙 ...

  9. 浅谈JS中的typeof和instanceof的区别

    JS中的typeof和instanceof常用来判断一个变量是否为空,或者是什么类型. typeof typeof运算符返回一个用来表示表达式的数据类型的字符串. typeof一般返回以下几个字符串: ...

随机推荐

  1. 关于CodeFirst异常:无法确定类型'XXX'和类型‘YYY’之间的关联的主体端,必须使用关系 Fluent API 或数据注释显式配置此关联的主体端。

    此错误的原因是,你配置两个实体间的关系为一对一 然而我认为的一对一关系是,两者之间必须存在一个主体, 也就是说,你不能表1的外键是表2的主键并且表1的主键是表2的外键, 这样不符合数据库式吧? 我想多 ...

  2. 【C#】让工具栏ToolStrip能触发焦点控件的Leave、Validating、DataError等事件以验证数据

    ----------------更新:2014-04-21--------------- 蒙doggo兄指教,得知有更好的方法可以代替蹩脚的0尺寸Button法,即调用窗体的验证方法Form.Vali ...

  3. ab网站压力测试

    ab网站压力测试命令的参数.输出结果的中文注解    permalink 以前安装好APACHE总是不知道该如何测试APACHE的性能,现在总算找到一个测试工具了.就是APACHE自带的测试工具AB( ...

  4. ScrollView与ListView冲突解决

    正 常来说,在ScrollView添加一个ListView后在真机上只会显示ListView的一行多一点,我也不理解为什么会这样,后来我把 ListView的layout_height改成400dip ...

  5. 第三讲:WCF介绍(3)

    代码 https://yunpan.cn/cPns5DkGnRGNs   密码:3913   前面我们通过一个小的例子,大概了解的WCF. 这里我们补充下  EndPoint 配置  A,B,C  中 ...

  6. jquery子元素选择器

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Android发送短信

    // 发送短信 public void sendMsg(){ String content = edtSend.getText().toString(); SmsManager smsManager ...

  8. jquery常见知识点 总结

    1. jquery特点 2. jquery中css选择器用法 jQuery使用了一套css选择器,共有5种,即标签选择器,ID选择器,类选择器,通用选择器和群组选择器,现分述如下:   标签选择器 用 ...

  9. Loadrunner中web_find和web_reg_find函数的使用与区别

    总结一下Loadrunner中的检查点函数,主要介绍两个函数:web_find()和web_reg_find():这两个函数均用于内容的查找,但两者也有本质的区别,具体介绍如下:一.web_find( ...

  10. java web学习总结(一) -------------------基本概念

    一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...