JavaScript中原型和原型链详解(4)


<script type="text/javascript">
    function Shape(){
        this.name = "shape";
        this.toString = function(){
            return this.name;
        }
    }
    function TwoShape(){
        this.name = "2 shape";
    }
    function Triangle(side,height){
        this.name = "Triangle";
        this.side = side;
        this.height = height;
        this.getArea = function(){
            return this.side*this.height/2;
        }
    }

TwoShape.prototype = new Shape();
    Triangle.prototype = new TwoShape();

TwoShape.prototype.constructor = TwoShape;
    Triangle.prototype.constructor = Triangle;

var my = new Triangle(5,10);
    my.getArea();
    my.toString();//Triangle
    my.constructor;//Triangle(side,height)
</script>

原型继承

原型继承:在原型链的末端,就是Object构造函数prototype属性指向的那个原型对象。这个原型对象是所有对象的祖先,这个老祖宗实现了诸如toString等所有对象天生就该具有的方法。其他内置构造函数,如Function,Boolean,String,Date和RegExp等的prototype都是从这个老祖宗传承下来的,但他们各自又定义了自身的属性和方法,从而他们的子孙就表现出各自宗族的那些特征。

ECMAScript中,实现继承的方法就是依靠原型链实现的。

复制代码 代码如下:


<script type="text/javascript">
    function Box(){             //被继承的函数叫做超类型(父类,基类)
        this.name = "Jack";
    }

function Tree(){          //继承的函数叫做子类型(子类,派生类)
        this.age = 300;
    }
    //通过原型链继承,赋值给子类型的原型属性
    //new Box()会将box构造里的信息和原型里的信息都交给Tree
    Tree.prototype = new Box();//Tree继承了Box,通过原型,形成链条

var tree = new Tree();
    alert(tree.name);//弹出 Jack
</script>

原型链的问题:原型链虽然很强大,可以用它来实现继承,但它也存在一些问题。其中最主要的问题来自包含引用类型的值原型。包含引用类型的原型属性会被所有实例共享;而这也正是为什么要在构造函数中,而不是在原型对象中定义属性的原因。在通过原型来实现继承时,原型实际上回变成另一个类型的实例。于是,原先的实例属性也就变成了原型的属性。

在创建子类型的实例时,不能向超类型的构造函数中传递参数。实际上,应该说是没有办法在不影响所有对象实例的情况下,给超类型的构造函数传递参数。再加上刚刚讨论的由于原型中包含引用类型值所带来的问题,实践中很少会单独使用原型链。

再举个栗子:

复制代码 代码如下:


<script type="text/javascript">
    function Person(name)
    {
        this.name = name;//设置对象属性
    };

Person.prototype.company = "Microsoft";//设置原型的属性
    Person.prototype.SayHello = function() //原型的方法
    { 
        alert("Hello,I'm "+ this.name+ " of " + this.company);
    };

var BillGates = new Person("BillGates");//创建person对象
    BillGates.SayHello();//继承了原型的内容,输出"Hello,I'm BillGates of Microsoft"

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgffpp.html