浅谈JS中的继承
前言
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中的继承的更多相关文章
- 浅谈JS中的闭包
浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...
- 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂
浅谈JS中的!=.== .!==.===的用法和区别 var num = 1; var str = '1'; var test = 1; test == num //tr ...
- 浅谈JS中 var let const 变量声明
浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...
- 浅谈js中继承的理解和实现
一.前言 java.C#等正统面向对象语言都会提供类似extend之类的处理类的继承的方法,而javascript并没有提供专门的方法用于继承,在javascript中使用继承需要一点技巧.js中实例 ...
- 由项目浅谈JS中MVVM模式
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1. 背景 最近项目原因使用了durandal.js和knock ...
- js架构设计模式——由项目浅谈JS中MVVM模式
1. 背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...
- 浅谈JavaScript中的继承
引言 在JavaScript中,实现继承的主要方式是通过原型链技术.这一篇文章我们就通过介绍JavaScript中实现继承的几种方式来慢慢领会JavaScript中继承实现的点点滴滴. 原型链介绍 原 ...
- 浅谈JS中的高级函数
在JavaScript中,函数的功能十分强大.它们是第一类对象,也可以作为另一个对象的方法,还可以作为参数传入另一个函数,不仅如此,还能被一个函数返回!可以说,在JS中,函数无处不在,无所不能,堪比孙 ...
- 浅谈JS中的typeof和instanceof的区别
JS中的typeof和instanceof常用来判断一个变量是否为空,或者是什么类型. typeof typeof运算符返回一个用来表示表达式的数据类型的字符串. typeof一般返回以下几个字符串: ...
随机推荐
- 国产达梦数据库的结合Enterprise Library的应用开发
在上篇<基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作>介绍了如何在Enterprise Library的数据访问层上支持这种神秘的国产数 ...
- iOS 阶段学习第11天笔记(OC基础知识)
iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import 用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...
- Hewlett-Packard Enterprise 实习总结日记
人生的第一份正式的实习工作时在HP,受益颇多.突然要离开了,还是非常舍不得的.在公司实习这半年多时间,写篇博客,对这期间的成长经历做一些总结.先说一个典故:我叫史蒂夫·乔布斯,我想找一些零件来做一台频 ...
- linux系统新建用户ssh远程登陆显示-bash-4.1$解决方法
linux系统新建的用户用ssh远程登陆显示-bash-4.1$,不显示用户名路径 网络上好多解决办法,大多是新建.bash_profile文件然后输入XXXXX....然而并没有什么用没有用.... ...
- Uploadify 上传插件引起Chrome崩溃解决方法
将Uploadify初始化代码延时加载,可解决Chrome崩溃. setTimeout(initUploadify, 60); function initUploadify() { var $Uplo ...
- 让你忘记 Flash 的15款精彩 HTML5 游戏
HTML5 游戏开发是一个热门的话题,开发人员和设计人员最近经常谈论到.虽然不能迅速取代 Flash 的地位,但是 HTML5 凭借它的开放性和强大的编程能力,取代 Flash 是必然的趋势.你会看到 ...
- 从0开始学angularjs-笔记01
一.angularjs简介 AngularJS 是一个为动态WEB应用设计的结构框架.它能让你使用HTML作为模板语言,通过扩展HTML的语法,让你能更清楚.简洁地构建你的应用组件.它的创新点在于,利 ...
- [deviceone开发]-课程表的例子
一.简介 这个例子是根据一个真实app的一个页面的需求来实现的demo,通过动态add ui的方式,动态bind数据构建一个完整的课程表示例.示例并不完善,但是可以给大家一个启发. 二.效果图 三.相 ...
- javascript之DOM
文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM把 ...
- Autodesk 最新开发技术研讨会-北京-上海-武汉-成都-西安-PPT下载
经过半月的奔波,转遍祖国大好河山.结论,还是喜欢成都,安逸~,好希望能在成都生活,竹林里品茶,不亦乐乎~ 如果你没能参加我们的研讨会,下面的PPT供参考: 面向世界.面向未来 – Autodesk 云 ...