原型和原型链

    技术2024-05-18  83

    原型和原型链

    原型和原型链的理解

    原型:js在创建对象(不论是普通函数还是函数对象的时候),都有一个叫做__proto__的内置属性,用于指向创建它的函数对象的原型对象prototype。每个对象都有原型对象,null除外。使用原型对象的好处是所有对象实例能够共享它所包含的属性和方法。原型链:主要解决了继承的问题;每个对象都拥有一个原型对象,通过__proto__ 指针指向其原型对象,并从中继承方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终指向 null。关于继承:原型对象中属性是通过原型链继承的;对象可以访问执行访问继承的所有的原型中的属性。

    原型的作用: 1.数据共享 节约内存内存空间 2.实现继承 注意:函数也是一个对象,对象不一定是函数。(对象有__proto__属性,函数有prototype属性)此处说明,方便大家理解下文。

    下面我将举例说明为什么要使用原型 例1:

    function Person(name) { this.name=name; this.eat=function () { console.log(this.name+"吃东西"); } this.sleep=function () { console.log(this.name+"睡觉"); } } var p1=new Person("小明"); p1.eat();//小明吃东西 p1.sleep();//小明睡觉 var p2=new Person("小利"); p2.eat();//小利吃东西 p2.sleep();//小利睡觉 console.dir(p1);//dir()打印结构 console.dir(p2);

    每次使用构造函数Person()实例化出对象的时候,就会给每个实例对象的eat()方法和sleep()方法开辟空间。可是当实例化许多对象的时候,就会浪费大量的空间,因为每个实例对象的eat()方法和sleep()的功能都是一样的,所以我们没必要为每个实例对象添加eat()方法和sleep()方法。

    这时原型就派上用场了,看下面经过改造的例子:

    function Person(name) { this.name=name; } Person.prototype.eat=function () { console.log(this.name+"吃东西"); }; Person.prototype.sleep=function () { console.log(this.name+"睡觉"); } var p1=new Person("小明"); p1.eat();//小明吃东西 p1.sleep();//小明睡觉 var p2=new Person("小利"); p2.eat();//小利吃东西 p2.sleep();//小利睡觉 console.dir(p1); console.dir(p2);

    eat()方法和sleep()被添加到了Person()构造函数的原型(prototype)上了。因此只有一份eat()方法和sleep()方法。当实例对象需要使用这些方法的时候就在自己的__proto__属性中找到并调用这些方法实现相应的功能。

    Processed: 0.017, SQL: 9