JS中的原型继承和多重继承

概念:1原型继承是创建新类型对象----子类型,子类型基于父类型,子类型拥有父类型所有的属性和方法(从父类型继承得到),然后修改其中的部分内容或者添加新的内容。继承最好在子类型模型可以被视为父类型对象的时候使用。

    2从多个父类型中派生出一个对象类型称为多重继承。

原型继承:

使用new关键字和构造函数的prototype属性都是定义类型的特定方式,这些是我们到目前为止一直使用的,对于简单的对象,这种方式还是很好的,但是当程序过度使用继承时,这种创建对象的方法很快就显得笨拙了。所以增加一些函数作为常用操作符可以使其顺利一些。例如很多人都在对象上定义inherit方法和method方法。

        Object.prototype.inherit=function(baseConstructor){
            this.prototype = clone(baseConstructor.prototype);
            this.prototype.constructor=this;
        };
        Object.prototype.method=function(name,func){
            this.prototype[name]=func;
        };    

有了上面的信息,就可以像下面这样编码

        function StrangeArray(){}
        StrangeArray.inherit(Array);
        StrangeArray.method("push",function(value){
            Array.prototype.push.call(this,value);
            Array.prototype.push.call(this,value);
        });
        var strange=new StrangeArray();
        strange.push(4);//输出[4,4]

多重继承(混合类型):

实现多重继承的方式很多,下面的一个小例子是比较简单的而且多数情况下都适用的。

mix-in是一种特殊的原型,它可以混入到其他的原型里。SmallItem可以看做这样的一个原型。通过将它的方法复制到另一个原型里,其自身也混入了那个复制方法的原型。

        function mixInto(object,mixIn){
            forEachIn(mixIn,function(name,value){
                object[name] = value;

            });
        };
        var SmallDetailedItem = clone(DetailedItem);
        mixInto(SmallDetailedItem,SmallItem);

        var deadMouse = SmallDetailedItem.create("Fred the mouse","he is dead");
        deadMouse.inspect();
        deadMouse.kick();

还有下面的例子就是三种继承的实现。

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script>
       function Person(name) {
            this.name = name;
        }
        Person.prototype.getName = function() {
            return this.name;
        }
        function Author(name, books) {
            this.books = books;
        }
        Author.prototype=new Person(name);
        Author.prototype.constructor=Author;
        Author.prototype.getBooks = function() {
            return this.books;
        }
        var au1=new Author("dororo1","Learn much");
        var au2=new Author("dororo2","Learn less");
        alert(au1.getName());
        alert(au2.getName());

       function Person(name) {
           this.name = name;
       }
       Person.prototype.getName = function() {
           return this.name;
       }
       function Author(name, books) {
           this.inherit=person;
           this.inherit(name);
           this.books = books;

       }
       var au=new Author("dororo","Learn much");
      alert(au.getName()) ;

       function Person(name) {
           this.name = name;
       }
       Person.prototype.getName = function() {
           return this.name;
       }
       function Author(name, books) {
           this.base = new Person(name);
           for(var key in this.base){
               if(!this[key]){
                   this[key]=this.base[key];
               }
           }
           this.book=books;
       }
       var au1=new Author("dororo1","work");
       var au2=new Author("dororo2","play");
       alert(au1.getName());
       alert(au2.getName());
       au1.book;
       au2.book;

    </script>
</head>
<body>

</body>
</html>
时间: 2024-12-20 05:27:30

JS中的原型继承和多重继承的相关文章

JS中的原型继承机制

转载 http://blog.csdn.net/niuyongjie/article/details/4810835 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下: 我们都知道,在JS中有一个function的东西.一般人们叫它函数.比如下面的代码 js代码: [javascript] view plaincopy function Person(name) { alert(name); } Perso

js中的原型、继承的一些想法

最近看到一个别人写的js类库,突然对js中的原型及继承产生了一些想法,之前也看过其中的一些内容,但是总不是很清晰,这几天利用空闲时间,对这块理解了一下,感觉还是有不通之处,思路上没那么条理,仅作为分享, 一.instanceof 在JavaScript有instanceof运算符,是二元运算符,使用方法 instanceA instanceof A,返回值是布尔值(boolean),含义是判断instanceA是否是A的一个实例,其实质是判断A.prototype===instanceA.__p

谈谈JS中的原型

不知道大家对JS中的原型理解的怎么样,我想如果大家对JS中的原型对象以及prototype属性十分熟悉的话对后面原型链以及继承的理解会十分的容易,这里想和大家分享自己对其的理解,请先看下面这段代码O(∩_∩)O~~ 1 function Person(){ 2 } 3 Person.prototype.name = "jingzi"; 4 Person.prototype.age = 20; 5 Person.prototype.sayName = function(){ 6 aler

node.js javascript理解原型继承

util.inherits util.inherits(constructor, superConstructor)是一个实现对象间原型继承的函数. JavaScript 的面向对象特性是基于原型的,与常见的基于类的不同.JavaScript 没有提供对象继承的语言级别特性,而是通过原型复制来实现的 var util = require('util'); function Base() { this.name = 'base'; this.base = 1991; this.sayHello =

js中的子类继承父类的方法和属性

上次讲了个简单的继承,这次 咱们讲个稍微复杂点的,那就是让子类继承父类的属性和方法,假设人 (Person)是父类,工人(Worker)是子类,让worker继承person的属性和方法: 父类: function Person(name,age) { this.name=name; this.age=age; } Person.prototype.showName=function() { alert(this.name); } function worker(name,age,job) {

js中的原型与原型链详解

js中的原型与原型链详解 记住下面三句话就可以理解原型: 所有的函数数据类型都天生自带一个属性Prototype(原型)这个属性的值是一个对象,浏览器会默认给他开辟一个堆内存 在浏览器给prototype开辟的堆内存当中有一个天生自带的属性是constructor,这个属性存储的值是当前函数本身 每一个对象都有一个__proto__的属性,这个属性指向当前实例所属类的prototype(如果不能确定他是谁的实例,都是Object的实例) 原型链:如果引用构造函数的实例想要查找某个属性p的话: 首

JS中的原型与继承

原型: Js所有的函数都有一个prototype属性,这个属性引用了一个对象,即原型对象,也简称原型.这个函数包括构造函数和普通函数,我们讲的更多是构造函数的原型,但是也不能否定普通函数也有原型.譬如普通函数: function F(){ ;}alert(F.prototype instanceof Object) //true 构造函数实例化对象的过程. function A(x){ this.x=x; } var obj=new A(1); 实例化obj对象有三步: 1. 创建obj对象:v

关于js的对象原型继承

javascript中,对象的继承是通过原型去继承. 可以这样理解:js中的对象,包含的除了属性和方法,还有一个最基本的原型__proto__对象.这个原型__proto__指向谁,这个对象就继承谁.这是最容易理解对象原型继承的一种方式. 如下面的代码: var student={ name:'zhangsan', age:21, run:function(){ return this.name+' is running!'; } }; var xiaoming={ name:'xiaoming

JavaScript中的原型继承

原型链: Object(构造函数) object(类型(对象)) var o = {}; alert(typeof o); //结果是object alert(typeof Object); //结果是function 每一个对象有一个属性叫  __proto__ ,这个属性就是这个对象的原型(o. __proto__) 对象有原型,原型也是对象,所以原型也有原型 所有的函数都是对象,继承自Function.prototype, Function.prototype是对象,继承自Object.p