Javascript原型链

来源:互联网 发布:win7注册表修复软件 编辑:程序博客网 时间:2024/06/17 15:27

明白javascript是如何创建对象的

  1. 通过字面量的方式

    var obj = new Object();
    var obj={};
    //字面量
    var a = {
    name:”aName”,
    age:18
    };
    var b= {
    name:”bName”,
    age:18
    };

    2.工厂模式
    //用函数的方式,创建对象
    function createPerson(name, age) {
    var o = new Object();
    o.name=name;
    o.age=age;
    o.sayName=function () {
    alert(this.name);
    };
    return o;
    }
    var person1=createPerson(“aaa”,18);
    var person2=createPerson(“bbb”,18);

    3.构造函数创建对象
    function create(name, age) {
    this.name=name;
    this.age=age;
    }
    var aa = new create(“does”,11);

一、原型链

Javascript原型链是ECMAScript实现继承过程中所产生的概念,学习javascript,就必须理解原型链的原理。


二、JAVA和Javascript继承区别

JAVA继承:
在一个类的基础上创建一个新类,extends
JAVASCRIPT继承:
在一个对象的基础上创建一个新的对象。原型则表示,原来基础上的对象


三、原型

如果我们通过字面量方法创建对象,比如我们创建一个Dog这个对象,这个对象中有eat()方法,则通过Dog.eat()调用即可,那如果我们再创建一个对象Cat,里面也有eat()方法,则也是通过Cat.eat(),那么问题来了,既然两个对象都有吃的方法,那么难道我们每次都需要在对象内写重复的eat()方法吗?显然不是的。因为同样的动作,我们可以共享其方法。贴上代码:

 var animal={    name:"动物",    eat:function () {        console.log(this.name+" is eating")    }};var dog={    name:"dog",    __proto__:animal};var cat={    name:"cat",    __proto__:animal};dog.eat();cat.eat();

因为cat和dog都是动物,动物细分为cat和dog,那么这就是对象,它们既然是动物所以共有吃的功能。
我们分别在dog和cat中加了__proto__指针,值为animal,所以dog和cat共享了eat()方法,所以,原型就为animal。


四、原型链讲解

通过上述代码可知道有__proto__这指针,指向的是原型对象,所以dog和cat这两个对象都不需要写入eat方法,那原型链说的是,js首先通过判断自己内部是否有这方法,如果没有则往上找这个方法,形成一条链。所以叫原型链。好比拔河比赛,一根绳子中你想找超胖的人,从头找到尾,总能找到一个超胖的人,找打了则返回结果。


说到这里,我们知道什么是原型和原型链了。但是,还没结束。因为我们还需要知道一个东西,那就是prototype

这又是啥呢?!!


五、prototype

首先我们已经知道javascript可以共享方法,那我们是否想知道为啥这玩意能共享呢?答案就在prototype里。
我们知道可以通过构造函数创建对象,那么我们先创建一个Person对象。当中有eat()的方法

 function Person(name, age) {    this.name=name;    this.age=age;    this.eat=function () {        console.log(this.name+" 我吃过饭啦");    }}

如果再创建两个对象person1和person2

var person1=new Person("xiaoming",11);var person2=new Person("xiaohua",11);

这样显然成功创建了两个对象,xiaoming和xiaohua,那么问题来了,xiaoming是男的,xiaohua是女的,如果构造函数function Person(name,age)这个构造函数有些方法男女是不能公用的,但是javascript中却又是在一个对象的基础上创建一个新的对象,所以我们不得不在Person的基础上拿了相同的方法。但是有些方法却又用不上的,岂不是很浪费自己的资源和占用不必要的内存?所以为了动态分配,有了prototype这个属性。

所以我们在原来基础上加一个prototype

Person.prototype.male=function () {    console.log(this.name+"我是男的");};Person.prototype.female=function () {    console.log(this.name+"我是女的");};var person1=new Person("xiaoming",11);person1.male();var person2=new Person("xiaohua",11);person2.female();

这样假如有一天,xiaohua想变男人了,一样能够调用male方法,这样不会相互影响。

参考博客:

http://barryliu1995.studio/2017/08/04/%E8%B0%88%E8%B0%88JavaScript%E7%9A%84%E5%8E%9F%E5%9E%8B%E5%8F%8A%E5%8E%9F%E5%9E%8B%E9%93%BE/#more

原创粉丝点击