你不知道的JavasScript上篇·第四章·混合对象·类
一、类的理论
1、类的核心概念:多态
- 是说父类的通用行为可以被子类用更特殊的行为重写
二、类的机制
1、构造函数
类实例是有一个特殊的类方法构造的,这个方法名通常和类名一致;
类构造函数属于类,构造函数大多需要用new来调。
2、类的多态
其实就是子类可以改写父类的同名方法也可以调用继承自父类的同名方法,
任何方法都可以引用继承层次中高层的方法,无论高层的方法名是否相同。
多态的另一个方面是,在继承链的不同层次中一个方法名可以多次被定义,调用方法时会自动选择合适的定义。
多态并不表示子类和父类有关联,子类得到的只是父类的一份副本。
类的继承其实就是复制。
3、混入
模拟类的复制行为,这个方法就是混入。
混入分为两种类型:显示和隐式
- 显示混入:手动进行复制的。
下面例子中 Person.eat.call(this) 就是显式多态
function mixin(sourceObj,targetObj){
for(key in sourceObj){
console.log(!(key in targetObj))
//当Person里有,targetObj里没有的时候才进行复制
if(!(key in targetObj)){
targetObj[key] = sourceObj[key]
}
}
return targetObj;
}
var Person = {
sex:'person',
drink:function(){
console.log('person要喝水')
},
eat:function(){
console.log('person要吃东西')
}
}
var girl = mixin(Person,{
sex:'girl',
eat:function(){
Person.eat.call(this);
console.log(this.sex+'要吃东西')
}
})
console.log(girl)
girl.eat();
运行结果如图:

复习上篇内容:
"属性名" in 目标对象:在目标对象上查找属性名也在原型链上也查找
Object.prototype.hasOwnPrototype.call(目标对象,属性名) 只在目标对象上查找属性
这里的
if(!(key in targetObj)){
targetObj[key] = sourceObj[key]
}
也可以写成
if(!(Objcet.prototype.hasOwnProperty.call(targetObj,key)){
targetObj[key] = sourceObj[key]
}
但是因为这里targetObj和souceObj并没有继承关系所以不必用Object.prototype.hasOwnProperty.call()
- 寄生继承
寄生继承是显式混入模式的一种变体,因为他既是显式的又是隐式的
实例:
function Animal(){
this.type = 'animal'
}
Animal.prototype.color = function(){
console.log("animal's color")
}
Animal.prototype.weight = function(){
this.color();
console.log("animal's weight")
}
function Cat(){
var cat = new Animal();
cat.type='cat';
var anweight = cat.color;
cat.weight = function(){
anweight.call(this);
console.log(this.type+"color" )
}
return cat;
}
var myCat = new Cat();
myCat.weight()
- 隐式混入
function Something = {
cool:function(){
this.greeting = 'hello world';
this.count = this.count ? this.count+1 : 1 ;
}
}
Something.cool();
Something.greeting();
Something.count;
var Another = {
cool:function(){
//隐式把Something混入Another
Something.cool.call(this)
}
}
Another.cool();
Another.greeting;//hello world
Another.count;//1
这样的结构容易搞不清this,对于方法的引用容易出现问题,一般不从采用这种结构
总结:
类是一种设计模式,也意味着复制。
类被继承时,行为(属性)也会被复制到子类中
多态(在继承链的不同层次名称相同但是功能不同的函数) 看起来似乎是从子类引用父类,但是本质上引用的其实是复制的结果
混入模式可以用来模拟类的复制行为,显式混入实际上无法完全模拟类的复制行为,因为在Js中对象只能复制引用,无法复制被引用的对象或者函数本身(函数也是对象)
你不知道的JavasScript上篇·第四章·混合对象·类的更多相关文章
- 你不知道的JavasScript上篇·第三章·对象
1.Object.defineProperty()&&getter.setter Object.defineProperty(目标对象,属性名(string型),{ get:funct ...
- 你不知道的JavasScript上篇·第五章·原型·下
5.差异继承 继承意味着复制操作: 差异继承: 基本原则是在描述对象行为时,使用其不同于普遍描述的特制. (我的理解是只用对象自身的而不用普遍继承的像是toString(),valueOf()这种方法 ...
- 你不知道的JavasScript上篇·第五章·原型·上
1.[[Prototype]] JS中的对象有一个特殊的[[Prototype]]内置属性,其实就是对于其他对象的引用.几乎所有的对象在创建时这个属性都被赋予一个非空的值 (proto) var my ...
- 《Java程序设计》第四章-认识对象
20145221<Java程序设计>第四章-认识对象 总结 教材学习内容总结 类与对象 定义:对象是Java语言中重要的组成部分,之前学过的C语言是面向过程的,而Java主要是面向对象的. ...
- JQuery制作网页—— 第四章JavaScript对象及初识面向对象
1.对象:在JavaScript中,所有事物都是对象,如字符串.数值.数组.函数等. JavaScript中的基本数据类型: number(数值类型) string(字符串类型) boolean ...
- Java 学习笔记 ------第四章 认识对象
本章学习目标: 区分基本类型与类类型 了解对象与参考的关系 从打包器认识对象 以对象观点看待数组 认识字符串的特性 一."=" 和 "==" 当=用于基本类型时 ...
- #《Essential C++》读书笔记# 第四章 基于对象的编程风格
基础知识 Class的定义由两部分组成:class的声明,以及紧接在声明之后的主体.主体部分由一对大括号括住,并以分号结尾.主体内的两个关键字public和private,用来标示每个块的" ...
- 《Python核心编程》 第四章 Python对象- 课后习题
练习 4-1. Python对象.与所有Python对象有关的三个属性是什么?请简单的描述一下. 答:身份.类型和值: 身份:每一个对象都有一个唯一的身份标识自己,可以用id()得到. 类型:对象的 ...
- 【2】python核心编程 第四章-python对象
1.python对象 所有的Python 对像都拥有三个特性:身份,类型和值. 身份: 每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数id()来得到. 这个值可以被认为是该对象的 ...
随机推荐
- git使用分支与tag
查看分支:git branch 创建分支:git branch <name> 切换分支:git checkout <name> 创建+切换分支:git checkout -b ...
- Shell - 简明Shell入门02 - 变量(Variable)
示例脚本及注释 #!/bin/bash v1=test-variable_123 # 全局变量 v2=12345 v3='This is a test!' # 赋值语句使用单引号或双引号可以包含空格 ...
- 开发ASP.NET MVC 在线录音录像(音视频录制并上传)
最近有个在线招聘录音的开发需求,需要在招聘网站上让招聘者上传录音和视频. 找到两个不错的javascript开源,可以在除了IE以外的浏览器运行. https://github.com/mattdia ...
- postgresql-递增uuid优点
递增uuid的优点: https://blog.2ndquadrant.com/on-the-impact-of-full-page-writes/ 减小wal生成
- github或码云协同开发
协同开发 1.引子:假如三个人共同开发同一份代码,每个人都各自安排了任务,当每个人都完成了一半的时候,提交不提交呢? 要提交,提交到dev吗,都上传了一半,这样回家拿出来的代码根本跑不起来.所以, 为 ...
- WebStorm project 打开多个项目的方法
File ---> Setting ---> Project:xxx ---> Sirectories 点击右侧 + Add content root,选择目录后即可显示该项目. ...
- list string 互转
List转字符串,用逗号隔开 List<string> list = new List<string>();list.Add("a");list.Add(& ...
- 《垃圾回收的算法与实现》——Python垃圾回收
Python垃圾回收 python采用引用计数法进行垃圾回收 Python内存分配 python在分配内存空间时,在malloc之上堆放了3个独立的分层. python内存分配时主要由arena.po ...
- ES6基础教程一 学习笔记
一.变量的声明 1.var 声明全局变量 在ES6中var用来声明全局变量. 2.let 声明局部变量 3.const 声明常量 二.变量的解构赋值 //1.数组赋值 let [a,b,c]=[1,2 ...
- Vue + Element UI 实现权限管理系统 前端篇(七):功能组件封装
组件封装 为了避免组件代码的臃肿,这里对主要的功能部件进行封装,保证代码的模块化和简洁度. 组件结构 组件封装重构后,试图组件结构如下图所示 代码一览 Home组件被简化,包含导航.头部和主内容三个组 ...