原型(prototype)

传统构造函数的问题

    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);
    //如果是访问数据,当前对象中如果没有该数据就到构造函数的原型属性中去找
    //如果是写数据,当对象中有该数据的时候,就是修改值; 如果对象没有该数据,那么就添加值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值