`
kongxiantao
  • 浏览: 112103 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascript 封装 继承

 
阅读更多

原文地址:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html
封装:

所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量。
对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。

Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。
这个对象的所有属性和方法,都会被构造函数的实例继承。
这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。

Prototype模式的验证方法:
isPrototypeOf() :这个方法用来判断,某个proptotype对象和某个实例之间的关系。
hasOwnProperty():每个实例对象都有一个hasOwnProperty()方法,
                用来判断某一个属性到底是本地属性,还是继承自prototype对象的属性。
               
in运算符 :    in运算符可以用来判断,某个实例是否含有某个属性,不管是不是本地属性。
            in运算符还可以用来遍历某个对象的所有属性。
           


原文地址:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html           
继承:

     function Animal(){
    this.species = "动物";
  }

    function Cat(name,color){
    this.name = name;
    this.color = color;
  }

1. 构造函数绑定:最简单的方法,大概就是使用call或apply方法,将父对象的构造函数绑定在子对象上,也就是在子对象构造函数中加一行

    function Cat(name,color){
    Animal.apply(this, arguments);
    this.name = name;
    this.color = color;
  }
  var cat1 = new Cat("大毛","黄色");
  alert(cat1.species); // 动物

2.prototype模式

    Cat.prototype = new Animal();
  Cat.prototype.constructor = Cat;
  var cat1 = new Cat("大毛","黄色");
  alert(cat1.species); // 动物

3. 直接继承prototype
   
    function Animal(){ }
  Animal.prototype.species = "动物";
   
    Cat.prototype = Animal.prototype;
  Cat.prototype.constructor = Cat;
  var cat1 = new Cat("大毛","黄色");
  alert(cat1.species); // 动物

4. 利用空对象作为中介
    var F = function(){};
  F.prototype = Animal.prototype;
  Cat.prototype = new F();
  Cat.prototype.constructor = Cat;

5. prototype模式的封装函数
   
    function extend(Child, Parent) {
    var F = function(){};
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
    Child.uber = Parent.prototype;
  }
    函数体最后一行:意思是为子对象设一个uber属性,这个属性直接指向父对象的prototype属性。
    这等于是在子对象上打开一条通道,可以直接调用父对象的方法。
    这一行放在这里,只是为了实现继承的完备性,纯属备用性质。

6. 拷贝继承
    function Animal(){}
  Animal.prototype.species = "动物";

    function extend2(Child, Parent) {
    var p = Parent.prototype;
    var c = Child.prototype;
    for (var i in p) {
      c[i] = p[i];
    }
    c.uber = p;
  }
   
    //调用
    extend2(Cat, Animal);
  var cat1 = new Cat("大毛","黄色");
  alert(cat1.species); // 动物


非构造函数的继承:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html

1、什么是"非构造函数"的继承?
    var Chinese = {
    nation:'中国'
  };
    var Doctor ={
    career:'医生'
  }
    这里要注意,这两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"
2、object()方法
    function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
  }
    //调用
    var Doctor = object(Chinese);
    Doctor.career = '医生';

3、浅拷贝:除了使用"prototype链"以外,还有另一种思路:把父对象的属性,全部拷贝给子对象,也能实现继承。

    function extendCopy(p) {
    var c = {};
    for (var i in p) {
      c[i] = p[i];
    }
    c.uber = p;
    return c;
  }
    //调用
    var Doctor = extendCopy(Chinese);
  Doctor.career = '医生';
  alert(Doctor.nation); // 中国

4、深拷贝   
    function deepCopy(p, c) {
    var c = c || {};
    for (var i in p) {
      if (typeof p[i] === 'object') {
        c[i] = (p[i].constructor === Array) ? [] : {};
        deepCopy(p[i], c[i]);
      } else {
         c[i] = p[i];
      }
    }
    return c;
  }
    //调用
    var Doctor = deepCopy(Chinese);
    Chinese.birthPlaces = ['北京','上海','香港'];
  Doctor.birthPlaces.push('厦门');
    alert(Doctor.birthPlaces); //北京, 上海, 香港, 厦门
  alert(Chinese.birthPlaces); //北京, 上海, 香港
   
    //说明
    目前,jQuery库使用的就是这种继承方法。

分享到:
评论

相关推荐

    javascript中如何实现封装,继承和多态

    javascript中如何实现封装,继承和多态

    Javascript中的封装与继承

    在这个文档中,我们将深入探讨JavaScript中的封装和继承这两个核心概念,帮助你更好地理解和应用这些知识。 封装是面向对象编程的基本原则之一,它涉及到如何组织和保护代码,以实现数据隐藏和功能模块化。在...

    国内外javascript经典封装

    通过学习和运用这些经典的JavaScript封装技术,开发者不仅能提升代码质量,还能跟上技术发展趋势,确保项目在未来的可扩展性和兼容性。同时,理解并熟练掌握封装原则,也是成为一名优秀JavaScript开发者的重要一步。

    国内外 JavaScript 经典封装

    理解如何创建对象、继承和封装是提升代码复用性和可维护性的重要一环。 2. **模块化**:JavaScript的经典封装往往涉及到模块化,如CommonJS、AMD(RequireJS)、UMD(Universal Module Definition)和ES6的模块系统...

    javascript中如何实现封装,继承和多态,并有详细

    javascript中如何实现封装,继承和多态,并有详细,我天天在传谢谢

    JS封装和继承-入门级

    尽管它没有像Java或C++那样的传统类(class)概念,但JavaScript依然提供了强大的面向对象编程能力,这主要体现在封装、继承和多态性上。本文将深入探讨JavaScript中的封装和继承,以及它们在实际应用中的实现。 ##...

    javascript 经典封装

    在这个压缩包中,包含了10个相关的RAR子文件,可能是关于JavaScript封装技术的不同示例或者教程。 1. **对象封装**:在JavaScript中,对象可以用来封装数据和功能。通过创建具有属性和方法的对象,我们可以更好地...

    JavaScript继承

    除了传统的原型链继承,JavaScript还支持其他继承模式,如组合继承(组合使用构造函数和原型链)、寄生继承(通过创建父类副本改进继承)、原型式继承(使用`Object.create()`)、寄生组合式继承(被认为是最有效的...

    Javascript经典封装代码

    - 原型链扩展:利用原型(prototype)对象,我们可以实现对象间的继承,封装通用方法,降低代码重复。 2. **模块化** - IIFE(立即执行函数表达式):常用于创建私有作用域,防止全局变量污染,同时也可封装代码...

    Javascript编程 类的继承及封装:Class

    笔者历经多年javascript的开发,痛彻体会javascript面向对象编程的不便性,精心制作了一个类的定义与继承功能的js,实现了在javascript中对类的定义、继承、封装机制,主要功能特征包括:  一、 统一了类定义的语法...

    学习javascript面向对象 javascript实现继承的方式

    通常是创建一个仅用于封装继承过程的函数,该函数内部以某种方式来增强对象,最后返回对象。 优点: - 可以在不影响其他对象的情况下,对对象进行功能扩展。 缺点: - 问题与原型式继承相同,所有新对象共享相同...

    简洁理解JavaScript中的封装与继承特性_.docx

    在JavaScript中,封装和继承是面向对象编程的关键概念,它们帮助我们构建更加高效、安全且易于维护的代码。封装主要是为了保护数据和方法不被非法访问,而继承则是为了实现代码复用和创建层次化的对象结构。 封装在...

    JavaScript 继承 封装 多态实现及原理详解

    在JavaScript中,面向对象编程(OOP)的三大特性为封装、继承和多态。以下是对这些特性的详细介绍,以及在JavaScript中如何实现和原理的探讨。 封装是面向对象编程的基石之一。它通过类(class)的概念将数据(属性...

    JavaScript继承与多继承实例分析.docx

    - **实现方式**:文中提供了一个简洁的封装,使用`Function.prototype.inherits`方法接受多个参数,遍历每个参数对象并将属性添加到子类型的原型上,实现了多继承的效果。 3. **实例分析** - 在第一个例子中,`...

    Javascript面向对象特性实现(封装、继承、接口).doc

    JavaScript是一种动态类型的脚本语言,虽然它不像Java或C#那样是典型的面向对象语言,但JavaScript仍然支持面向对象编程的概念,包括封装、继承和接口。下面我们将深入探讨这些概念。 **封装**是面向对象编程的基本...

    Javascript学习笔记9 prototype封装继承

    本文将深入探讨如何利用JavaScript中的prototype(原型)来封装继承机制,以及如何实现面向对象的继承特性。 ### prototype与继承的关系 在JavaScript中,每个对象都有一个原型(prototype),原型本身也是一个...

    JavaScript使用prototype原型实现的封装继承多态示例

    最后,通过在线HTML/CSS/JavaScript代码运行工具,可以进一步测试代码的运行结果,验证封装、继承和多态是否按预期工作。如果遇到任何问题,可以参考《javascript面向对象入门教程》、《JavaScript错误与调试技巧...

    javascript中如何实现封装,继承和多态,并有详细的示例.ppt

    JavaScript的OOP机制主要涉及封装、继承和多态。以下是对这些概念的详细解释: **封装**: 封装是将数据和操作数据的方法捆绑在一起的过程,以保护数据不被外部直接访问。在JavaScript中,我们通常使用构造函数来...

    前端模块化脚手架,可实现类似java的封装继承多态特性

    这个名为“前端模块化脚手架”的工具,旨在为前端开发者提供一个类似于Java语言的封装、继承和多态特性的开发环境。通过这样的框架,开发者可以在JavaScript中模拟出面向对象编程的特性,使前端开发更加规范和高效。...

Global site tag (gtag.js) - Google Analytics