Js 面向对象之封装,继承,原型,原型链
function Cat (name, color) {
return {
name: name,
color: color
}
}
var cat1 = Cat("大毛", "黄色");//{name: "大毛", color: "黄色"}
var cat2 = Cat("二毛", "黑色");//{name: "二毛", color: "黑色"}
这种模式并不能看出来 cat1 和 cat2 是同一个原型对象的实例
构造函数模式
function Cat (name, color) {
this.name = name;
this.color = color;
this.age = "5";
}
var cat1 = new Cat("大毛", "黄色");
var cat2 = new Cat("二毛", "黑色");
cat1.constructor == Cat;//true
cat2.constructor == Cat; //true
cat1.constructor == cat2.constructor//true
cat1 instanceof Cat ;// true
function Cat (name, color) {
this.name = name;
this.color = color;
}
Cat.prototype.age = "10";
var cat1 = new Cat("大毛", "黄色");
var cat2 = new Cat("二毛", "黑色");
cat1.age; // 10;
cat2.age; // 10;
// 创建父构造函数
function SuperClass(name){
this.name = name;
this.showName = function(){
alert(this.name);
}
}
// 设置父构造器的原型对象
SuperClass.prototype.Age = '123';
// 创建子构造函数
function SubClass(){}
// 设置子构造函数的原型对象实现继承
SubClass.prototype = SuperClass.prototype;
//生成实例
var child = new SubClass() child.name // undefined
child.Age //
//即 子构造函数.prototype = new 父构造函数()
// 创建父构造函数
function SuperClass(){
this.name = 'HiSen';
this.age = 25;
this.showName = function(){
console.log(this.name);
}
}
// 设置父构造函数的原型
SuperClass.prototype.friends = ['js', 'css'];
SuperClass.prototype.showAge = function(){
console.log(this.age);
}
// 创建子构造函数
function SubClass(){}
// 实现继承
SubClass.prototype = new SuperClass();
// 修改子构造函数的原型的构造器属性,因为此时继承了父构造函数指向 //SuperClass; 所以要修改一下。
SubClass.prototype.constructor = SubClass; //生成实例
var child = new SubClass();
console.log(child.name); // HiSen
console.log(child.age);//
child.showName();// HiSen
child.showAge();//
console.log(child.friends); // ['js','css'] // 当我们改变friends的时候, 父构造函数的原型对象的也会变化
child.friends.push('html');
console.log(child.friends);// ["js", "css", "html"] var father = new SuperClass();
console.log(father.friends);// ["js", "css", "html"]
此时再看:发现子构造函数 不仅继承了父构造函数原型 prototype 上的成员,也继承了其它成员。可是修改子构造函数的属性时,我们发现父构造函数的原型对象也对应修改,那有没有办法屏蔽这一种情况呢 ? 接着往下看:
拷贝实现继承
说到拷贝,可能会分深拷贝和浅拷贝,其实:
浅拷贝是对象的属性的引用,而不是对象本身; (浅拷贝只拷贝一层,如果存在多层还是会影响原对象)
深拷贝是创建一个新的内存地址保存值 ; (与原对象互不影响)
下边我列举两个拷贝的方法来实践一下:
浅拷贝
例举一个简单的浅拷贝: 对象形式
function clone(source) {
var target = {};
for(var i in source) {
if (source.hasOwnProperty(i)) {
target[i] = source[i];
}
}
return target;
}
深拷贝
对象形式的深拷贝
function clone(source) {
var target = {};
for(var i in source) {
if (source.hasOwnProperty(i)) {
if (typeof source[i] === 'object') {
target[i] = clone(source[i]); // 注意这里
} else {
target[i] = source[i];
}
}
} return target;
}
数组形式的深拷贝
function clone(source) {
var out = [],i = 0,len = source.length;
for (; i < len; i++) {
if (source[i] instanceof Array){
out[i] = clone(arr[i]);
}
else out[i] = source[i];
}
return out;
}
当然出了以上这些实现继承的方法以外还有更多的方式同样可以实现继承,例如:
Object.create();继承
Object.defineProperties()
的第二个参数一样)。注意:该参数对象不能是 undefined
,另外只有该对象中自身拥有的可枚举的属性才有效,也就是说该对象的原型链上属性是无效的。var obj = {
"a":'123',
fun :function () {
alert(1)
}
}
var jc = Object.create(obj); jc.a; //123
jc.fun();//1
我们可以看到,jc 继承了 obj 的属性;同时也继承了 obj 对象的方法;
ES6钟提供了一个方法 Object.assign();
方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。Object.assign
是ES6的新函数。Object.assign()
Object.assign(target, ...sources)
target:目标对象。
sources:任意多个源对象。
var obj = { a: {a: "hello", b: 21} };
var initalObj = Object.assign({}, obj); initalObj.a.a = "changed";
console.log(obj.a.a); // "changed"
最后再说一种最简单的方式,转成字符串 - 再转回来;
var obj1 = { o: { a: 1 } };
var obj2 = JSON.parse(JSON.stringify(obj1));
Js 面向对象之封装,继承,原型,原型链的更多相关文章
- 原生JS面向对象思想封装轮播图组件
原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能 ...
- JS面向对象(封装,继承)
在六月份找工作中,被问的最多的问题就是: js面向对象,继承,封装,原型链这些,你了解多少? 额,,,我怎么回答呢, 只能说,了解一些,不多不少,哈哈哈哈,当然,这是玩笑话. 不过之前学过java,来 ...
- JS高级---逆推继承看原型
逆推继承看原型 function F1(age) { this.age = age; } function F2(age) { this.age = age; } F2.prototype = new ...
- 用js面向对象思想封装插件
js是基于原型的面向对象语言,如果你学过java,c#等正统面向对象语言,你会难以理解js的面向对象,他和普通的面向对象不太一样,今天,我们通过封装一个toast插件,来看看js面向对象是如何运行的. ...
- 从零开始的全栈工程师——JS面向对象( 六大继承 )
一.对象克隆 var obj = { name:'li', age:23 } var obj2 = obj; // 这不是对象克隆 只是把obj的内存地址给obj2 1.for in克隆(浅拷贝) ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- objective-c自学总结(三)---面向对象的封装,继承与多态
面向对象的三大特性 封装 继承 多态 1.封装: 隐藏属性,方法或实现细节的过程称为封装 信息隐藏,隐藏对象的实现细节,不允许用户看到 将东西包装在一 然后以新的完整形式呈现出来 例如,两种或多种化学 ...
- JavaScript 对象的原型扩展(JS面向对象中的继承)
<script type="text/javascript"> function person(name, age) { this._name = name; this ...
- 实例了解js面向对象的封装和继承等特点
1.面向对象特点 相比之前按照过程式写法,面向对象有以下几个特点; 1.抽象:抓住核心问题,就是将很多个方法放在一个对象上.对象由属性和方法组成,属性就是我们定义的变量,它是静态的:方法就是行为操作, ...
随机推荐
- ORACLE数据库数据的备份与恢复
原创作品,转自请在文字开头显眼位置注明出处:https://www.cnblogs.com/sunshine5683/p/10052949.html 数据备份恢复在数据库管理中至关重要,今天,总结一下 ...
- Java的工厂模式(二)
除了上文提到的方法之外,还可以使用Java的反射机制,这样就能使用类名称来加载所需要的类.我们只需改变工厂类和驱动类就可以了. FruitFactory.java package com.muggle ...
- Win8操作系统下IIS如何配置asp.net的运行环境(win7同样)
一.把鼠标放在电脑屏幕的左下角然后右击,弹出如下图菜单,选择“程序和功能”(快捷键win+X).(win7点击电脑左下角的“开始”,然后点击“控制面板”打开程序与功能界面): 二.进入程序与功能界面后 ...
- PoPo数据可视化周刊第6期
PoPo数据可视化 聚焦于Web数据可视化与可视化交互领域,发现可视化领域有意思的内容.不想错过可视化领域的精彩内容, 就快快关注我们吧 :) 本期可视化精彩视频请关注公众号浏览 全天智能获Pre-A ...
- Js如何调用本地应用程序
一般情况下,浏览器中是无法直接和本机的其他的程序进行交互的,在IE中,我们可以通过ActiveX对象的方式进行.但是这个方式只适用于IE浏览器,另一种比较通用的方式便是URL协议的方式,我们将某种UR ...
- 【c++错误】类的语法错误 error c2533:constructors not allowed a return type(构造函数不允许返回一个类型)
今天编写类的程序的时候不小心把类后的分号忘写了,就出现上面的错误提示. 顺便复习下类的正确格式: class 类名 { public: //习惯上将公有类型放在前面,便于阅读 ……(外部接口) pro ...
- 知识蒸馏(Distillation)
蒸馏神经网络取名为蒸馏(Distill),其实是一个非常形象的过程. 我们把数据结构信息和数据本身当作一个混合物,分布信息通过概率分布被分离出来.首先,T值很大,相当于用很高的温度将关键的分布信息从原 ...
- android studio使用openssl
前言 逆向的基础是开发, 逆向分析时很多时候会使用一些公开的加密函数来对数据进行加密,通过使用 openssl 熟悉下. 正文 首先得先编译出来 openssl,然后把它们复制到你的工程目录下. in ...
- idea 断点调试
一.步骤控制 二.查看变量 IDEA debug查看变量值有3种方法: 1.鼠标悬浮 2.alt+f8快捷键(选中变量表达式,比如匿名变量或方法参数,再按atl+f8,接着回车) 3.debug窗口查 ...
- centos 安装golang笔记
1.使用yum安装 yum install go 这个命令可以将go环境安装到linux上. 2.配置gopath 第一步安装成功的go命令会被放入/usr/lib/golang/bin /usr/l ...