JS继承以及继承的几种实现方式总结
//方法一:Object构造函数方式
var Person = new Object();
Person.name = “shuaige”;
Person.age = 24;
Person.sing = function() {
console.log(‘twinkle twinkle little star’);
}
//这种方式的弊端是不能作为创建对象的模版,不能用new进行构造心对象
//方法二:对象字面量方法创建(字面量创建对象的方式优点就是解析的非常快)
var Obj = {
name : “shuaige”,
age : 24,
//定义方法
sing : function() {
console.log(‘twinkle twinkle little star’);
}
}
//调用对象中的方法
Obj.sing();
//查看对象中的属性
console.log(Obj.name);
//方法三:构造函数的方式创建对象(这里会提到构造函数存在的问题)
function Person(name, age) {//构造函数的创建过程:1.创建this = {};2.给this赋值;3.返回this
this.name = name;
this.age = age;
this.sing = function() {
console.log(‘twinkle twinkle little star’);
}
//这里其实是有个隐式的返回的:return this;
//构造函数中可以显示的指定return语句,如果返回的数据类型为基本数据类型或者null以及undefiend值都会被忽略,依旧返回的是构造函数的实例对象,但是返回的类型为引用类型,就不会忽略!
}
//实例化
var shuaige = new Person(“shuaige”, 24);
var meinv = new Person(“meinv”, 24);
//调用对象中的方法
shuaige.sing();
//查看对象中的属性
console.log(obj.name);
//问题:shuaige和meinv两个实例对象的sing方法是一个方法么
Console.log(shuaige.sing == meinv.sing);//false
//这就是构造函数方法创建对象的弊端,每个方法都要在每个实例对象中重新创建一遍,如果方法特别多,那么就会占用很多不必要的内存
function Person(name) {//构造函数Person
this.name = name;
}
Person.prototype.sing = function() {
console.log("twinkle twinkle little star");
}
var p1 = new Person("xiaoming");
var p2 = new Person("xiaohong");
console.log(p1.sing == p2.sing);//true 原型由此解决了数据共享的问题
Person.prototype.address = "北京”;//定义公共属性address
console.log(p1.address);//北京
console.log(p2.address);//北京
p1.address = "上海”;//添加私有属性
console.log(p1.address);//上海,自身有address属性,获取自身的address
console.log(p2.address);//北京,自身没有address属性,去原型上面去找
p1.prototype.lacation = “a”//报错 can not set property location of undefined 因为实例对象是无权修改原型上的属性和方法的
//若想改变原型上的属性和方法要通过以下方式
Person.prototype.address = “西安”
console.log(p1.address);//西安
console.log(p2.address);//西安
以上其实就是一种原型继承的方式,p1和p2都可以访问Person.prototype对象的属性和方法,所以在这里可以说是p1和p2都继承于Person.prototype;
2、类式继承(运用call方法改变this指向)
function Person(name, age) {
this.name = name;
This.age = age;
this.say = function() {
console.log(“hello”);
}
}
function Student(name, age, id) {
Person.call(this, name, age);//利用call方法能够改变this的指向,在此处调用Person构造函数,实现的是给Student实例对象添加以及赋值属性的操作
this.id = id;
this.study = function () {//构造函数的弊端,在自身上面添加公共的方法,这就需要下面的组合继承方式来规避
console.log(“弟子不必不如师”);
}
}
function Teacher(name, age, pay) {
Person.call(this, name, age);
this.pay = pay;
this.teach = function () {
console.log(“师不必不如弟子”);
}
}
var st1 = new Student(“xiaoming”, 18);
var tc1 = new Teacher(“mr Li”, 28);
function Person(name, age) {
this.name = name;
This.age = age;
this.say = function() {
console.log(“hello”);
}
}
function Student(name, age, id) {
Person.call(this, name, age);
this.id = id
}
Student.study = function () { //构造函数student的所有实例对象的公共方法
console.log(“弟子不必不如师”);
}
function Teacher(name, age, pay) {
Person.call(this, name, age);
this.pay = pay;
}
Teacher.prototype.teach = function() { //构造函数Teacher的所有实例对象的公共方法
console.log(“师不必不如弟子”);
}
var st1 = new Student(“xiaoming”, 18);
var tc1 = new Teacher(“mr Li”, 28);
function A(name) {
this.name = name;
}
function B(sex) {
this.sex = sex;
this.sleep = function () {
console.log("kun kun kun~~~")
}
}
B.prototype.age = 20;
var a = new A("xiaoming");
var b = new B("boy”)
//extend方法思路:遍历parent对象中的属性以及方法并将其添加到child对象中去,从而实现继承,即child继承于parent,可以访问parent对象中的属性和方法
function extend (child, parent) {
for (var pro in parent) {
if (parent.hasOwnProperty(pro)) {//若没有这一行代码,parent对象原型上的属性和方法也会被遍历添加
child[pro] = parent[pro];
}
}
}
extend(a, b);
a.sleep();//kunkunkun~~~
console.log(a.age);//undefined;
关于创建对象的几种方式以及原型原型原型链相关知识会在日后总结。
想要做好一件事先要能够沉浸其中吧,静心做事,沉浸在代码的世界里,这也是一种享受,愿看到文章的朋友也会每天有收获,每天进步一点点。
JS继承以及继承的几种实现方式总结的更多相关文章
- js简繁转换,两种实现方式,妥妥的~
不知道繁简按钮有什么卵用,大陆人自带繁简转换开关的好么,但是还是项目要求,做了这么一个功能,现在整理给大家用~完美兼容~么么哒 按钮的样式可以随便用css定义,注意id不要变,注意jq的事件绑定好就o ...
- hibernate笔记--继承映射关系的三种实现方式
单表继承映射(一张表): 假设我们现在有三个类,关系如下: Person类有两个子类Student和Teacher,并且子类都具有自己独有的属性.这种实体关系在hibernate中可以使用单表的继承映 ...
- 1+x学习日志——js获取随机颜色的几种实现方式
因为学习时间比较紧,所以也没多少时间发博客了.后续会慢慢补齐的,下面是代码 /// function randomColor(){ var r = parseInt(Math.random() * 2 ...
- js中实现继承的几种方式
首先我们了解,js中的继承是主要是由原型链实现的.那么什么是原型链呢? 由于每个实例中都有一个指向原型对象的指针,如果一个对象的原型对象,是另一个构造函数的实例,这个对象的原型对象就会指向另一个对象的 ...
- js(javascript) 继承的5种实现方式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt240 js继承有5种实现方式:1.继承第一种方式:对象冒充 functio ...
- 【js】实现继承的6种方法
1.原型链 基本思想:利用原型链让一个引用类型继承另一个引用类型的属性和方法. 让原型对象(B.prototype)等于另一个类型的实例(new A()), 即B.prototype = new A( ...
- js对象的继承以及公有私有属性的定义和读写
最近想写一些js工具,有些方面需要用到面向对象的方法,比如继承父类属性和方法.通过私有化隐藏某些对象的属性等,因为没有系统的学习js,所以不知道怎么做,觉得很伤脑筋. 今天受到技术群里朋友的提示,并查 ...
- js中的继承
js中继承的实现方式很多,此处给出两种常用方式. <!DOCTYPE html> <html> <head> <meta charset='UTF-8'> ...
- web前端开发必懂之一:JS继承和继承基础总结
首先,推荐一篇博客豪情的博客JS提高: http://www.cnblogs.com/jikey/p/3604459.html ,里面的链接全是精华, 一般人我不告诉他; 我们会先从JS的基本的设计模 ...
随机推荐
- SpringBoot进阶教程(二十三)Linux部署Quartz
在之前的一篇文章中<SpringBoot(九)定时任务Schedule>,已经详细介绍了关于schedule框架的配置和使用,有收到一些朋友关于部署的私信,所以抽时间整理一个linux部署 ...
- [macOS开发.NET Core] 开篇 & 抉择 & 先利其器
一直以来MacBook是大多数开发者的首选,无论是macOS的便利性,还是MBP的外观,更或者是为了装13,我一直认为一个开发者必须得拥有一部MBP.虽然最后的因素是大多数的. 终于在我的努力下说服下 ...
- 图像检索(5):基于OpenCV实现小型的图像数据库检索
本文对前面的几篇文章进行个总结,实现一个小型的图像检索应用. 一个小型的图像检索应用可以分为两部分: train,构建图像集的特征数据库. retrieval,检索,给定图像,从图像库中返回最类似的图 ...
- springcloud情操陶冶-bootstrapContext(一)
基于前文对springcloud的引导,本文则从源码角度查阅下cloud的context板块的运行逻辑 前言 springcloud是基于springboot开发的,所以读者在阅读此文前最好已经了解了 ...
- python基于函数替换的热更新原理介绍
热更新即在不重启进程或者不离开Python interpreter的情况下使得被编辑之后的python源码能够直接生效并按照预期被执行新代码.平常开发中,热更能极大提高程序开发和调试的效率,在修复线上 ...
- 个人对【依赖倒置(DIP)】、【控制反转(IOC)】、【依赖注入(DI)】浅显理解
一.依赖倒置(Dependency Inversion Principle) 依赖倒置是面向对象设计领域的一种软件设计原则.(其他的设计原则还有:单一职责原则.开放封闭原则.里式替换原则.接口分离原则 ...
- 80后程序员降薪6K,预感中年危机来袭,准备跳槽却碰壁
一提及程序员,很多人想到的都是“工资高”“技术好”诸如此类的,可见程序员是个非常赚钱的职业,所以每年都会有很多毕业生来选择这个行业. 但是社会是公平的,不要只看程序员表面上的光鲜亮丽,其背后也有很多的 ...
- mybatis 参数格式异常-- Error querying database. Cause: java.lang.NumberFormatException: For input string
mybatis中 <if></if>标签中进行判断时,如果传入的时字符格式和数字进行判断需要将数字进行转译,否则默认是数字和数字进行比较,这是就会出现参数格式异常如<if ...
- Sublime Text3介绍和插件安装——基于Python开发
Subime编辑器是一款轻量级的代码编辑器,是收费的,但是可以无限期使用.官网下载地址:https://www.sublimetext.com. Sublime Text3支持语言开发种类多样,几乎可 ...
- 通用查询类封装之Mongodb篇
查询在应用程序中很重要,花样也特别多,不同得业务需求需要不同的查询条件,还要支持and.or ……事实上也确实如此,程序中有N多个查询类,并且很可能其中有多个类查询同一张表,所以特别想弄一个通用的查询 ...