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的基本的设计模 ...
随机推荐
- MySQL视图简介与操作
1.准备工作 在MySQL数据库中创建两张表balance(余额表)和customer(客户表)并插入数据. create table customer( id int(10) primary key ...
- [个人网站搭建]·Django增加评论功能(Python3)
[个人网站搭建]·Django增加评论功能 个人主页--> https://xiaosongshine.github.io/ 个人网站搭建github地址:https://github.com/ ...
- Redis协议规范(RESP)
Redis 即 REmote Dictionary Server (远程字典服务): 而Redis的协议规范是 Redis Serialization Protocol (Redis序列化协议) 该协 ...
- cocos creator主程入门教程(九)—— 瓦片地图
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇介绍瓦片地图,在开发模拟经营类游戏.SLG类游戏.RPG游戏,都会使用到瓦片地图.瓦片地图地面是通 ...
- Windows 10 安装ElasticSearch(2)- MSI安装ElasticSearch和安装Kibana
翻阅上篇文章:Windows 10 安装 ElasticSearch 上次写的是下载Zip包安装的,在下载页面 发现有 MSI (BETA) 的下载可选项.了解之后发现MSI安装也值得尝试. MSI安 ...
- 制作联动时,数据绑定combox控件会触发SelectedIndexChanged事件
看过很多个网站的解决办法,基本雷同,还不能解决,真怀疑他们是互相直接炒的,没事通过验证. 在做省市区的三级联动时候出现这个问题,最后通过先设置值对象和显示对象,最后才绑定数据,这样一个逻辑操作,什么问 ...
- hadoop集群的搭建
hadoop集群的搭建 1.ubuntu 14.04更换成阿里云源 刚刚开始我选择了nat模式,所有可以连通网络,但是不能ping通,我就是想安装一下mysql,因为安装手动安装mysql太麻烦了,然 ...
- socket通信如何处理每次包长度不定问题
说起来,这是一个漫长的问题: 客户端和服务器通信的结构是:包头+数据长度+数据 客户端请求服务器发送200包数据.包头=request:长度=4(一个int),数据=200: 服务器在收到客户端的请求 ...
- FelxCell常用属性设置(未完待续......)
this.grid1.AllowUserPaste//返回或设置是否允许用户粘贴文字和格式 grid1.Cell(Rows, 1).WrapText = true;//设置单元格自动换行
- Python迭代器详解
最近在看两个github项目的代码时对迭代器有些困惑,因此写一篇笔记以理清脉络,经过两天的修改完善对迭代器有了一个初步的理解,相信会比网上绝大多数笔记有用些. 一.基础概念 在进行具体的迭代类和迭代函 ...