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.抽象:抓住核心问题,就是将很多个方法放在一个对象上.对象由属性和方法组成,属性就是我们定义的变量,它是静态的:方法就是行为操作, ...
随机推荐
- Jprofiler注册码
L-Larry_Lau@163.com#23874-hrwpdp1sh1wrn#0620 L-Larry_Lau@163.com#36573-fdkscp15axjj6#25257 L-Larry_L ...
- 【Java】字符拼接成字符串的注意点
这两天敲代码的时候,偶然间发现一个好玩的事情,分享一下,记录一下. 该段代码主要是:先产生的几个整数,把整数转换成对应的字符,最后的字符拼接成字符串,在把字符拼接成字符串的时候,个人因为偷懒使用+号进 ...
- ef oracle参数化问题
并非所有变量都已绑定 假如一个sql是这样的 string sql =@" select id from a where date between :StartDate and :EndDa ...
- 推荐 VSCode 上特别好用的 Vue 插件 - vetur
作者 @octref 此前 V2EX 发过帖子,最近新增代码补全功能,综合比较应该是目前 VSCode 上面最好用的 Vue 插件. 能够实现在 .vue 文件中: 语法错误检查,包括 CSS/SCS ...
- 不使用JavaScript让IE浏览器支持HTML5元素——张鑫旭
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2515 如果我们不做什 ...
- (一)windows下安装MongoDB解压版
windows下安装MongoDB解压版 我安装的是(mongodb-win32-x86_64-2008plus-ssl-4.0.8.zip)版本 亲测可以使用. 连接: Windows下MongoD ...
- input pattern中常用的正则表达式
常用的正则表达式 pattern的用法,只是列出来一些常用的正则: 信用卡 [0-9]{13,16} 银联卡 ^62[0-5]\d{13,16}$ Visa: ^4[0-9]{12}(?:[0-9]{ ...
- egg.js-基于koa2的node.js入门
一.Egg.JS 简介 Egg.JS是阿里开发的一套node.JS的框架,主要以下几个特点: Egg 的插件机制有很高的可扩展性,一个插件只做一件事,Egg 通过框架聚合这些插件,并根据自己的业务场景 ...
- 无法在类...中找到资源".bmp"
在WinForm中写的一个程序,在项目中添加了一个bmp图片,然后 public void SetSubType(int SubType) { m_subType = SubType; switch ...
- L3(SP+OO+UT)能力评估