js五种继承优缺点
//1.原型继承
//缺点: 当父级的属性有引用类型的时候,任意一个实例修改了这个属性,其他实例都会受影响
// 1)基本类型:Number Boolean String undefined null
// 2)引用类型:Object Function
function Person(){
this.class = '人';
this.name = '张三';
this.say = function(){
console.log(this.name);
}
};
function Man(name,age){
this.name = name;
this.age = age;
};
Man.prototype = new Person();
var man = new Man('广发',18);
console.log(man);
//2.借用构造函数继承
//缺点:父类的方法会被创建多次
function Person(){
this.class = '人类';
this.say = function(){
console.log('我是人类');
}
}
function Man(name,age){
this.name = name;
this.age = age;
//借用构造函数
Person.call(this);
}
var man = new Man('广发',18);
console.log(man);
var man2 = new Man('广发',20);
console.log(man.say===man2.say);//false
//3寄生式继承
function Person(o){ //参数o是一个传进来的对象
缺点:没用到原型,无法复用
var obj = Object.create(o);
//console.log(obj._proto_ === o); //false
obj.class = '人类';
obj.say = function(){
console.log(this.name);
}
return obj;
}
//要传入的对象
var aman = {
name:'广发',
age:100
}
var man = Person(aman);
console.log(man);
//4.组合式继承
//唯一缺点:父类的构造器被调用了两次
function Father(){ //父级
this.class = '人类';
alert('测试被调用多少次');
};
Father.prototype.say = function(){ //把方法放到原型里
console.log(this.name);
}
function Child(name,age){
this.name = name;
this.age = age;
Father.call(this);//借用构造函数
}
Child.prototype = new Father();//Child原型继承了Father,这样就可以调用原型里面的方法了
var man = new Child('广发',18);
console.log(man);
var man2 = new Child('广发',20);
console.log(man.say === man2.say);//true,因为在原型里面都能调用,所以他们这个方法是相等的
// 5 终极版 寄生组合式继承
//什么?缺点?你信不信我打你
function Person(){
this.class = '人类';
alert('测试调用了几次');
}
Person.prototype.say = function(){
console.log(this.name);
}
Man.prototype = Object.create(Person.prototype);
function Man(name,age){
this.name = name;
this.age = age;
Person.call(this);
}
var man = new Man('广发',18);
console.log(man);
有时候玩着玩着就找不到原型构造器了,所以我们要重新找回构造器
//构造器重定向(找回构造器)
Man.prototype.constructor = Man;
1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法。
2. 相同点:这两个方法的作用是一样的。
都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域。
一般来说,this总是指向调用某个方法的对象,但是使用call()和apply()方法时,就会改变this的指向。
说明: call方法可以用来代替另一个对象调用一个方法,call方法可以将一个函数的对象上下文从初始的上下文改变为thisObj指定的新对象,如果没有提供thisObj参数,那么Global对象被用于thisObj。
简单明了
call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。
js五种继承优缺点的更多相关文章
- js一种继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法。
js一种继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法. function ClassA(sColor) { this.color = sColor; } ClassA ...
- js 五种绑定彻底弄懂this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解
壹 ❀ 引 可以说this与闭包.原型链一样,属于JavaScript开发中老生常谈的问题了,百度一搜,this相关的文章铺天盖地.可开发好几年,被几道this题安排明明白白的人应该不在少数(我就是 ...
- JS五种绑定彻底弄懂this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解(转载)
目录 壹 ❀ 引 贰 ❀ this默认绑定 叁 ❀ this隐式绑定 1.隐式绑定 2.隐式丢失 肆 ❀ this显式绑定 伍 ❀ new绑定 陆 ❀ this绑定优先级 柒 ❀ 箭头函数的this ...
- js五种设计模式说明与示例
第一种模式:js工厂模式 var lev=function(){ return "啊打"; }; function Parent(){ ...
- 【设计模式+原型理解】第三章:javascript五种继承父类方式
[前言] 我们都知道,面向对象(类)的三大特征:封装.继承.多态 继承:子类继承父类的私有属性和公有方法 封装:把相同的代码写在一个函数中 多态: ->重载:JS严格意义上是没有重载,但可以通过 ...
- JavaScript五种继承方式详解
本文抄袭仅供学习http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html 一. 构造函数绑定 ...
- js五种基本数据类型:string, number, boolean, null, undefined
/** * 五种基本数据类型:string, number, boolean, null, undefined */ // undefined // 声明变量foo,未声明变量bar var foo; ...
- 第21篇 js四种继承方式
js是一个很自由的语言,没有强类型的语言的那种限制,实现一个功能往往有很多做法.继承就是其中的一个,在js中继承大概可以分为四大类,上面一篇文章也提及过一些,下面开始详细说说js的继承. 1.原型继承 ...
- js五种设计模式
1.js工厂模式 var lev=function(){ return "嘿哈"; }; function Parent(){ var Child = new object(); ...
随机推荐
- Tomcat 配置Https
https://www.cnblogs.com/wanghaoyuhappy/p/5267702.html JDK1.8 keytool 生存证书 C:\keys\tomcat.keystore 1: ...
- 尚硅谷springboot学习19-日志切换
查看相关依赖关系,排除相关依赖,引入新的日志依赖 slf4j+log4j的方式: <dependency> <groupId>org.springframework.boot& ...
- Redis-stat 的安装与使用
一.ruby源码安装 下载最新版的 Ruby 压缩文件.请点击这里下载. 下载 Ruby 之后,解压到新创建的目录下: $ tar -xvzf ruby-2.2.3.tgz $ cd ruby-2.2 ...
- Redis进阶实践之三如何在Windows系统上安装安装Redis(转载)
Redis进阶实践之三如何在Windows系统上安装安装Redis 一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括 ...
- JAVA JDK配置
配置环境变量_jdk 1.右键选择[计算机]——[属性] ——[左上角的高级系统设置] 2.点击[环境变量] 3.在[系统变量]里点击[新建], 变量名填写JAVA_HOME,变量值填写JDK的安装路 ...
- Redis Cluster 添加/删除 完整折腾步骤
Redis还是挺好玩的,今天测试了集群的添加.删除节点.重分配slot等.更深入的理解redis的游戏规则.步骤繁多,但是详细. 环境解释: 我是在一台Centos 6.9上测试的,各个redis节点 ...
- UVA11572-Unique Snowflakes-(最长不同连续子序列)
题意:给n个数,求最长不同连续子序列.n<=1e6. 解题过程: 1.记录数据存于数组 2.用左右指针l和r指向这段连续区间 3.右指针往右走,如果遇到没有存在于set集合的数就插入集合 否则左 ...
- ABAP表控件查询
1.准备工作 首先SE11自建一个数据库表(数据元素,域信息请提前建好) 2.编写代码 2.1 新建一个子屏幕 子屏幕中需新定义一个文本输入框,命名为:key_word,新建一个表控件,命名为tab, ...
- 基于oslo_log的日志管理
oslo_log是openstack中的日志模块,其对python logging的封装,可以快速便捷地写出我们的日志模块.官网上有许多参考示例,但实例永远是实例,其配合oslo_config模块,快 ...
- SVN基本页面