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(); ...
随机推荐
- 2018SDIBT_国庆个人第四场
A - A 这题很巧妙啊,前两天刚好做过,而且就在博客里 Little C Loves 3 I time limit per test 1 second memory limit per test ...
- spark1.6.1 on yarn搭建部署
注:本文是建立在hadoop已经搭建完成的基础上进行的. Apache Spark是一个分布式计算框架,旨在简化运行于计算机集群上的并行程序的编写.该框架对资源调度,任务的提交.执行和跟踪,节点间的通 ...
- ReactiveX 学习笔记(8)错误处理和 To 操作符
Error Handling Operators Operators to Convert Observables 本文的主题为对 Observable 进行错误处理的操作符以及转换 Observab ...
- Extjs4 上传图片并进行图片格式以及大小验证
在做项目是遇到上传图片,并在前端限制图片上传的大小,下面就直接贴出主要的上传图片的代码,以及图片大小的验证,但前端没有验证图片的宽高验证 一.先创建出上传图片的组件,使用filefield组件 var ...
- LeetCode OJ 56. Merge Intervals
题目 Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6], ...
- oracle函数大全-字符处理函
字符函数——返回字符值 这些函数全都接收的是字符族类型的参数(CHR 除外)并且返回字符值.除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值.字符函数的返回类型所受的限制和基本数据库类 ...
- python 基础回顾 一
Python 基础回顾 可变类型:list ,dict 不可变类型:string,tuple,numbers tuple是不可变的,但是它包含的list dict是可变的. set 集合内部是唯一的 ...
- asp.net中的reportview报错跟预编有关系
当报表控件出现: 报表定义无效.详细信息:根级别上的数据无效.行1,位置1. 先检查一下,你的aspx文件是不是变成了这样一句话 这是预编译工具生成的标记文件,不应被删除! 如果这样的话,报表控件是不 ...
- 关于xml中自动提示功能的设置
我们在编写xml文件时如果有自动提示功能,将会事半功倍,下面我就怎么设置xml进行说明: 在xml文件的开始几行一般有编写xml文件的语法要求;如 <!DOCTYPE hibernate-con ...
- monkeyrunner学习笔记
前面部分内容转自http://blog.csdn.net/zm2714/article/details/7980634 Android自动化测试之Monkeyrunner使用方法及实例 目前andro ...