js继承的几种方法理解和代码演示
1、属性继承 :call 、apply:不建议使用浪费内存。
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
Person.prototype.eat = function(){
console.log("正在吃饭")
}
Person.prototype.sleep = function(){
console.log("正在睡觉")
}
function Man(larynx,beard,name,age,sex,){
Person.call(this,name,age,sex)
this.larynx = larynx;
this.beard = beard;
}
Man.prototype.work = function(){
console.log('111')
}
var songlei = new Man(10,20);
console.log(songlei);
// Man{
// age: undefined
// beard: 20
// larynx: 10
// name: undefined
// sex: undefined
// }
2、原型继承:
3、原型拷贝:
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
Person.prototype.eat = function(){
console.log("正在吃饭")
}
Person.prototype.sleep = function(){
console.log("正在睡觉")
}
function Man(larynx,beard,name,age,sex,){
Person.call(this,name,age,sex)
this.larynx = larynx;
this.beard = beard;
}
for(var key in Person.prototype){
Man.prototype[key] = Person.prototype[key]
}
Man.prototype.work = function(){
console.log('111')
}
var aaa = new Man(10,20);
console.log(aaa);
// Man { name: undefined, age: undefined, sex: undefined, larynx: 10, beard: 20 }
// __proto__:
// eat: ƒ()
// sleep: ƒ()
// work: ƒ()
// constructor: ƒ Man(larynx, beard, name, age, sex)
var p1 = new Person()
console.log(p1)
// Person { name: undefined, age: undefined, sex: undefined }
// __proto__:
// eat: ƒ()
// sleep: ƒ()
// constructor: ƒ Person(name, age, sex)
4、原型链继承:
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
Person.prototype.eat = function(){
console.log("正在吃饭")
}
Person.prototype.sleep = function(){
console.log("正在睡觉")
}
function Man(larynx,beard,name,age,sex,){
Person.call(this,name,age,sex)
this.larynx = larynx;
this.beard = beard;
}
// __proto //__proto__
Man.prototype = new Person();
Man.prototype.work = function(){
console.log('111')
}
var aaa = new Man(10,20);
console.log(aaa);
// Man{
// age: undefined
// beard: 20
// larynx: 10
// name: undefined
// sex: undefined
// __proto__: Person
// age: undefined
// name: undefined
// sex: undefined
// work: ƒ()
// }
var p1 = new Person()
console.log(p1)
// Person{
// age: undefined
// name: undefined
// sex: undefined
// __proto__:
// eat: ƒ()
// sleep: ƒ()
// constructor: ƒ Person(name, age, sex)
// }
5、寄生继承:
缺点:增加了无用的函数
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
Person.prototype.type="人类";
Person.prototype.eat = function(){
console.log("正在吃饭")
}
Person.prototype.sleep = function(){
console.log("正在睡觉")
}
function Man(larynx,beard,name,age,sex,){
Person.call(this,name,age,sex)
this.larynx = larynx;
this.beard = beard;
}
//创建了一个寄生器
function fn(){};
//寄生器的原型对象 = 人类的原型对象
fn.prototype = Person.prototype;
//原型链继承 寄生器的实例对象
Man.prototype = new fn();
Man.prototype.constructor = Man;
Man.prototype.work = function(){
console.log('111')
}
var aaa = new Man(10,20);
console.log(aaa);
// Man{
// age: undefined
// beard: 20
// larynx: 10
// name: undefined
// sex: undefined
// __proto__: Person
// constructor: ƒ Man(larynx, beard, name, age, sex)
// work: ƒ()
// }
6、混合继承:我最喜欢的一种方式
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
Person.prototype.type="人类";
Person.prototype.eat = function(){
console.log("正在吃饭")
}
Person.prototype.sleep = function(){
console.log("正在睡觉")
}
function Man(larynx,beard,name,age,sex,){
Person.call(this,name,age,sex)
this.larynx = larynx;
this.beard = beard;
}
//Man.prototype = Object.create(Person.prototype);
Man.prototype = {
constructor:Man,
__proto__:Person.prototype
}
Man.prototype.work = function(){
console.log('111')
}
var aaa = new Man(10,20);
console.log(aaa);
// Man{
// age: undefined
// beard: 20
// larynx: 10
// name: undefined
// sex: undefined
// __proto__: Person
// constructor: ƒ Man(larynx, beard, name, age, sex)
// work: ƒ()
// }
var p1 = new Person();
console.log(p1)
// Person{
// age: undefined
// name: undefined
// sex: undefined
// __proto__:
// eat: ƒ()
// sleep: ƒ()
// type: "人类"
// constructor: ƒ Person(name, age, sex)
// }
7、Es6继承
class Person{
constructor(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
eat(){}
sleep(){}
}
class Man extends Person{
constructor(larynx,beard){
//实现继承必须使用super
super();
this.larynx = larynx;
this.beard = beard;
}
work(){}
}
var aaa = new Man()
console.log(aaa)
// Man{
// age: undefined
// beard: undefined
// larynx: undefined
// name: undefined
// sex: undefined
// __proto__: Person
// constructor: class Man
// work: ƒ work()
// }
js继承的几种方法理解和代码演示的更多相关文章
- 实现JS继承的几种方法
总的来说,JS的继承大体上分为两种:借用构造函数方式和原型方式 首先,我们来看看借用构造函数方式的几种做法: //方式一function Person(name, sex){ this.name = ...
- JS继承的6种方法
1.原型链 基本思想:利用原型让一个引用类型继承另外一个引用类型的属性和方法. 构造函数,原型,实例之间的关系:每个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针,而实例都包含一个指向原 ...
- JS学习笔记——JavaScript继承的6种方法(原型链、借用构造函数、组合、原型式、寄生式、寄生组合式)
JavaScript继承的6种方法 1,原型链继承 2,借用构造函数继承 3,组合继承(原型+借用构造) 4,原型式继承 5,寄生式继承 6,寄生组合式继承 1.原型链继承. <script t ...
- js对象之间的"继承"的五种方法
今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = & ...
- 4.Javascript中实现继承的几种方法及其优缺点
要搞懂JS继承,我们首先要理解原型链:每一个实例对象都有一个__proto__属性(隐式原型),在js内部用来查找原型链:每一个构造函数都有prototype属性(显示原型),用来显示修改对象的原型, ...
- js去除空格12种方法
注:本文非本人原著:原文作者: 黄卉 <js去除空格12种方法> //JS去除空格的方法目前共有12种: //实现1 String.prototype.trim = function() ...
- 判断数组的方法/判断JS数据类型的四种方法
参考文: 以下 3 个判断数组的方法,请分别介绍它们之间的区别和优劣Object.prototype.toString.call() . instanceof 以及 Array.isArray() h ...
- Java执行shell脚本并返回结果两种方法的完整代码
Java执行shell脚本并返回结果两种方法的完整代码 简单的是直接传入String字符串,这种不能执行echo 或者需要调用其他进程的命令(比如调用postfix发送邮件命令就不起作用) 执行复杂的 ...
- js继承的几种实现方法
一.用function实现: function Person(name) { this.name = name; } Person.prototype.getName = function() { r ...
随机推荐
- [Codeforces 1265E]Beautiful Mirrors
Description 题库链接 一共有 \(n\) 个关卡,你初始在第一个关卡.通过第 \(i\) 个关卡的概率为 \(p_i\).每一轮你可以挑战一个关卡.若通过第 \(i\) 个关卡,则进入第 ...
- MySql数据封装操作类
1.先引用MySQL的DLL文件 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...
- shell脚本awk的基本用法
AWK 1 AWK 2 3 linux取IP地址 4 5 ifconfig | grep -w inet | sed -n '1p' | awk '{print $2}' 6 7 eg: 8 9 aw ...
- 图书检索系统C版本
原创,转载请注明出处! 程序具有一下功能窗口界面1,Input输入(读入文件,所有的文件都读入)2,Output输出(检验是否读取正确,从结构体数组读入)3,Length统计(此文件里有110本图书) ...
- 微信H5中禁止分享好友及分享到朋友圈的方法
我们可以直接把以下代码加入到页面中,即可限制住各类分享. <script> function onBridgeReady() { WeixinJSBridge.call('hideOpti ...
- [USACO12MAR]花盆 二分 单调队列
[USACO12MAR]花盆 二分 单调队列 存在一个长度为\(x\)的区间\([l,r]\),使得区间中最大值与最小值差至少为\(w\),求这个最小的\(x\) \(n\le 100000\),\( ...
- 退役II次后做题记录
退役II次后做题记录 感觉没啥好更的,咕. atcoder1219 历史研究 回滚莫队. [六省联考2017]组合数问题 我是傻逼 按照组合意义等价于\(nk\)个物品,选的物品\(\mod k\) ...
- 【loj3059】【hnoi2019】序列
题目 给出一个长度为 \(n\) 的序列 \(A\) ; 你需要构造一个新的序列\(B\) ,满足: $B_{i} \le B_{i+1} (1 \le i \lt n ) $ $\sum_{i=1} ...
- vuex如何实现数据持久化,刷新页面存储的值还存在
1.安装: npm install vuex-persistedstate --save 2.找到store/index.js import Vue from 'vue' import Vuex fr ...
- TypeScript规则整理
介绍我在初学 TS 开发项目中遇到的一些问题,希望对你有所帮助~ 因为我们的JavaScript是弱类型语言,如果项目过大,或者团队人数很多,不仅代码风格不统一,以后还会很难维护 Ty ...