文档章节

简析面向对象中的继承,原型链,闭包之继承

JSON_P
 JSON_P
发布于 2016/09/15 00:01
字数 721
阅读 1
收藏 0

     我们理解的继承简单来说就是拿来主义:自己没有,别人有,把别人的拿过来使用或者让其成为自己的。那么如何实现继承呢?

一,混入继承

由于一个对象可以继承自任意的对象,即:o可以继承自对象o1,o2,o3...,所以,把这种继承称为:混入继承。

将其他对象中的成员加到自己身上

对象可以继承自任意的对象

var o1 = {name:"女娲", age: 1, gender: "female"};var o2 = {grade: "三年级二班", score: 100};

// o2 继承 o1for ( var k in o1 ) {
  o2[k] = o1[k];}

// 如果希望 o2 可以继承自任意的对象. 所以为了简化继承的代码// 给 o2 提供一个方法, 叫 extendo2.extend = function (obj) {
    for (var k in obj) {
        this[k] = obj[k];
    }   
}

o2.extend(o1);  // o2 继承 o1

二,原型继承

如果需要让一个对象拥有某些属性和方法,可以把这些属性和方法放到原型对象中,因为对象会继承自原型对象,所以就获得了该属性和方法。把这种继承方式称为:原型继承。

实现继承的方式

1 利用对象的动态特性  添加成员
2 覆盖原型对象        添加成员
3 利用混入继承        添加成员

原型的一些结论

1 任何函数都可以作为构造函数
2 函数默认就有一个 prototype 属性
3 函数的prototype 就是 原型
4 构造函数的prototype的类型是对象 
5 通过构造函数创建出来的对象默认链接到构造函数的prototype中
6 原型的成员(属性和方法)可以被对象共享

原型继承实现方式

1 ,利用对象的动态特性

// 对象可以动态的添加属性var o = {};o.name = "川川";o.age = 19;o.gender = "男";

// -----------------------function Person() {}

// 将需要的属性添加到原型对象中Person.prototype.sayHi = function() {};

var p = new Person();p.sayHi();

2, 覆盖原型对象

Person.prototype = {
    sayHi: function() {},
    sayNo: function() {},
    sayYouAgin: function() {}};
注意:
使用覆盖原型对象方式实现继承的时候, 
推荐给这个新对象添加一个 constructor 属性(属性的值为:当前的构造函数)
目的是保持和 默认情况的原型结构一样(模拟对象的类型)

但是如果对对象的类型要求不严格可以忽略

constructor: Person

3, 利用混入继承添加原型成员

对象2.extend( 对象1 )

三,经典继承 - Object.create

基本语法:

var o1 = { 
    sayHi: function() {
        alert("hello,i am chuanchuan");
    }};

var o2 = Object.create(o1);o2.sayHi();

两种实现兼容的方式:

// 1 给原生对象添加成员if(!Object.create) {
    Object.create = function() {
        // 构造函数
        function F() {}
        // 继承
        F.prototype = obj;
        return new F();
    };}

// 2 统一使用新方法(推荐)var create = function( obj ) {
    if ( Object.create ) {
        return Object.create( obj );
    } else {

        function F() {}
        F.prototype = obj;
        return new F();
    }}

 

© 著作权归作者所有

JSON_P
粉丝 7
博文 18
码字总数 9688
作品 0
闵行
前端工程师
私信 提问
简析面向对象中的继承,原型链,闭包之原型链

理解原型链 我理解中的原型链的东西简单的说就是一条链式结构的对象。就是说对象有原型对象,原型对象也是对象,所以,原型对象也有原型对象,这样一环扣一环,就形成了一条链式结构,叫做:...

JSON_P
2016/09/22
37
0
每个JavaScript工程师都应懂的33个概念

摘要: 基础很重要啊! 原文:33 concepts every JavaScript developer should know 译文:每个 JavaScript 工程师都应懂的33个概念 作者:stephentian Fundebug经授权转载,版权归原作者所有...

Fundebug
2018/10/30
0
0
浅谈闭包,原型链,面向对象

闭包: 百度百科: 官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。 闭包的特点:   1.作为一个函数变量的一...

尚有
2018/01/11
0
0
JavaScript开发者应懂的33个概念

简介 这个项目是为了帮助开发者掌握 JavaScript 概念而创立的。它不是必备,但在未来学习(JavaScript)中,可以作为一篇指南。 本篇文章是参照 @leonardomso 创立,英文版项目地址在这里。 ...

大灰狼的小绵羊哥哥
2018/10/22
0
0
全面理解面向对象的 JavaScript

简介: JavaScript 函数式脚本语言特性以及其看似随意的编写风格,导致长期以来人们对这一门语言的误解,即认为 JavaScript 不是一门面向对象的语言,或者只是部分具备一些面向对象的特征。本...

IBMdW
2013/04/21
1K
6

没有更多内容

加载失败,请刷新页面

加载更多

iOS Xcode升级包地址(感谢大神)

下载地址:DeviceSupport

_____1____
5分钟前
2
0
Qt编写自定义控件71-圆弧进度条

一、前言 现在web形式的图表框架非常流行,国产代表就是echart,本人用过几次,三个字屌爆了来形容,非常强大,而且易用性也非常棒,还是开源免费的,使用起来不要太爽,内置的各种图表和仪表...

飞扬青云
5分钟前
1
0
润乾报表与 ActiveReport JS 功能对比

简介 润乾报表是用于报表制作的大型企业级报表软件,核心特点在于开创性地提出了非线性报表数学模型,采用了革命性的多源关联分片、不规则分组、自由格间运算、行列对称等技术,使得复杂报表...

泡泡糖儿
17分钟前
3
0
【1015】LNMP架构二

【1015】LNMP架构二 三、PHP安装 PHP安装和LAMP安装PHP方法有差别,需要开启php-fpm服务 1、下载PHP7至/usr/local/src/ 切换目录:cd /usr/local/src 2、解压缩 tar -jxvf php-7.3.0.tar.gz...

飞翔的竹蜻蜓
51分钟前
4
0
浅谈Visitor访问者模式

一、前言 什么叫访问,如果大家学过数据结构,对于这点就很清晰了,遍历就是访问的一般形式,单独读取一个元素进行相应的处理也叫作访问,读取到想要查看的内容+对其进行处理就叫作访问,那么...

青衣霓裳
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部