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.抽象:抓住核心问题,就是将很多个方法放在一个对象上.对象由属性和方法组成,属性就是我们定义的变量,它是静态的:方法就是行为操作, ...
随机推荐
- Unix 高手的10个好习惯
引言 当您经常使用某个系统时,往往会陷入某种固定的使用模式.有时,您没有养成以尽可能最好的方式做事的习惯.有时,您的不良习惯甚至会导致出现混乱.纠正此类缺点的最佳方法之一,就是有意识地采用抵制这些坏习 ...
- 深入理解MyBatis的原理(三):配置文件(上)
前言:前文提到一个入门的demo,从这里开始,会了解深入 MyBatis 的配置,本文讲解 MyBatis 的配置文件的用法. 目录 1.properties 元素 2.设置(settings) 3. ...
- 整理 node-sass 安装失败的原因及解决办法
npm install 时偶尔遇到报错:没有安装python或node-sass 安装失败的问题,百度之后发现是被墙了,但根据百度的方法换了淘宝镜像和用了vpn都安装失败,最后发现原来是因为没有卸载之 ...
- VS2013平台安装Qt插件过程
1.下载所需安装包: Qt5.3.Qt插件下载地址:http://qt-project.org/downloads. qt-vs-addin-1.1.11-opensource.exe 下载地址:ht ...
- 拜拜了,浮动布局-基于display:inline-block的列表布局——张鑫旭
一.一抹前言 没有爱的日子,时间如指尖细沙,不知不觉就流逝了.写“CSS float浮动的深入研究.详解及拓展(一)”和“CSS float浮动的深入研究.详解及拓展(二)”似乎就在不久前,然而相隔差 ...
- CSS 媒体查询创建响应式网站
使用 CSS 媒体查询创建响应式网站 适用于所有屏幕大小的设计 固定宽度的静态网站很快被灵活的响应式设计所取代,该设计可以根据屏幕大小进行上扩和下扩.利用响应式设计,无论您采用什么设备或屏幕来访问网 ...
- webpack2引入bootstrap的坑
在webpack官网教程的代码分离-css章节中,给出的例子是这样的. //安装 ExtractTextWebpackPlugin 如下 npm install --save-dev extract- ...
- LeetCode 527---Word Abbreviation
527. Word Abbreviation Given an array of n distinct non-empty strings, you need to generate minimal ...
- 网络I/O模型--05多路复用I/O
多路复用I/O模型在应用层工作效率比我们俗称的 BIO 模型快的本质原因是,前者不再使用操作系统级别的“同步 I/O”模型 . 在 Linux 操作系统环境下, 多路复用 I/O 模型就是技术人员通常 ...
- 软工读书笔记 week 8 —— 《疯狂的程序员》
这次接着上一次的进度继续阅读,并将其中感悟较深的几点记录如下. 程序员是一个幕后工作者 书中绝影给医院写软件,而医生(用户)只是评价这个软件好不好用,而不会去评价写这个软件的程序员优不优秀. ...