使用原型解决构造函数问题

 

1. 关键点

  • 每一个函数在定义的时候,都会有跟它关联的一个对象被创建出来
  • 每一个由构造函数创建出来的对象,都会默认的和构造函数的神秘对象关联
  • 当使用一个方法进行属性或者方法访问的时候,会先在当前对象内查找该属性和方法
  • 如果当前对象内未找到,就回去跟它关联的神秘对象内进行查找
function Person(name, age){
    this.name = name; this.age = age; this.sayHi = function(){ console.log("Hello!"); }; } var p = new Person("张三", 18); p.sayHi(); //当前对象内有这个方法,所以不会去神秘对象内进行查找 var p1 = new Person("李四", 19); p1.sayHello(); //当前对象没没有找到这个方法,所以去神秘对象内进行查找 

问题来了,如何访问到这个神秘对象呢?


//可以通过 构造函数.prototype 访问这个神秘对象
console.log(Person.prototype);

当尝试给这个对象新增一个方法之后:

Person.prototype.sayHello = function(){
    console.log("我是神秘对象中的方法"); }; 

使用

p
,
p1
都可以访问这个方法:

p.sayHello();
p1.sayHello();

总结:

所有对象共享神秘对象(构造函数.prototype)内的属性和方法。

2. 解决方案

既然所有对象共享神秘对象(构造函数.prototype)内的属性和方法。我们只需要将需要共享的东西,也就是重复占用内存的东西,全部都放到 神秘对象(构造函数.prototype)中,那么所有对象就都可以使用,并且内存里面也只有一份了。

改造构造函数

function Person(name, age){
    this.name = name; this.age = age; } Person.prototype.sayHi = function(){ console.log("你好"); }; //测试 var p = new Person("张三", 18); var p1 = new Person("李四", 19); console.log(p.sayHi == p1.sayHi); //输出true 

3.常见的错误

3.1. 将属性写在神秘对象(构造函数.prototype)内

function Car(name){
     this.name = name; } function Person() {} Person.prototype.name = '张三'; //基本类型的属性影响不大 Person.prototype.car = new Car("法拉利"); //引用类型的属性,会被所有的对象共享 var p = new Person(); 

3.2. 赋值的错误


function Person() {}

Person.prototype.name = '张三'; var p1 = new Person(); var p2 = new Person(); p1.name = '李四'; console.log( p1.name ); console.log( p2.name ); // 如果是访问数据, 当前对象中如果没有该数据就到构造函数的原型属性中去找 // 如果是写数据, 当对象中有该数据的时候, 就是修改值; 如果对象没有该数据, 那么就添加值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值