原型(prototype)

来源:互联网 发布:2016淘宝盗图新规则 编辑:程序博客网 时间:2024/06/11 05:58

传统构造函数的问题

    function Foo() {        this.sHello = function (){        }    }
  • 由于对象是调用new Foo() 所创建出来的,因此每一个对象在 创建的时候,函数sHello 都会被创建一次
  • 那么每个对象都含有一个独立的,不同的,但是功能逻辑一样的函数, 比如:{} == {}
  • 在代码中方法就会消耗性能,最典型的资源就是内存.
  • 这里最好的办法就是将函数体放在构造函数之外,那么在构造函数中 只需要引用该函数即可
    function sHello (){}    function Foo(){        this.s = sHello;    }
  • 会在发开中变得困难:引入框架危险,代码繁冗不好维护,解决办法 就是外面的函数如果不占用名字,而且在函数旗下就好了。

  • 每一个函数在定义的时候,有一个神秘对象创建出来,

  • 每一个由构造函数创建的对象都会默认的链接到该神秘对象上。
    var f1 = new Foo();    var f2 = new Foo();    f1.sHello();//如果f1没有sHello,那么就会在Foo。prototype中去找    f2.sHello();//如果f2没有sHello,那么就会在Foo。prototype中去找
  • 由构造函数创建出来的众多对象共享一个对象,就是构造函数 .prototype
  • 只需要将共享的东西,重复会多占用内存的东西放到构造函数 .prototype 中,
    那么所有的对象
    function Foo() {}    Foo.prototype.sHello = function (){        console.log('...');    };    var f1 = new Foo();    f1.sHello();    var f2 = new Foo();    f2.sHello();    console.log( f1.sHello === f2.sHello ); //true

练习:

function Student (name, age, gender){    this.name = name;    this.age = age;    this.gender = gender;}Student.prototype.sHello = function(){    console.log('你好');  };Student.prototype.study = function(){    console.log('学习');}

常见错误

  • 写构造函数.prototupe 的时候,将属性也加到里面。
    function Person() {}    Person.prototupe.name = '张三';    var p = new Person();    //name是死的无法改变的。    //有一个函数创建出来的对象都需要初始化这个属性时,时对的。    //数组初始化的时候都是空数组;
  • 赋值的错误
    function Person() {}    Person.prototupe.name = '张三';    var p1 = new Person();    var p2 = new Person();    p1.name = '李四';    console.log(p1.name);    console.log(p2.name);    //如果是访问数据,当前对象中如果没有该数据就到构造函数的原型属性中去找    //如果是写数据,当对象中有该数据的时候,就是修改值; 如果对象没有该数据,那么就添加值。
原创粉丝点击