类/对象/构造函数

类是对象的模板,对象是类的实例。在es6之前并没有引入类的概念,对象是通过构造函数来定义的。

创建对象的方式:

1.对象字面量
2.new Object()
3.自定义构造函数

构造函数与原型

构造函数 用来初始化对象,与new一起使用,可以把对象中的一些公共属性和方法封装到这个函数中。

注意:

  • 构造函数创建某一类对象时,首字母要大写
  • 构造函数与new 一起使用才有意义
// 构造函数
function Star(uname,age){
  // 构造函数中成员分为俩种:实例成员和静态成员
  // 实例成员:构造函数内通过this添加的成员
  // 实例成员只能通过实例化对象访问
  this.uname = uname;
  this.age = age;
  this.sing = function(){
    console.log('唱起来');
  }
}
// 原型对象上定义dance方法,这个方法共享到所有构造函数的实例中
Star.prototype.dance = function(){
  console.log('跳');
}
var ldh = new Star('刘德华',18);
ldh.sing();
// 静态成员:在构造函数本身上添加的成员   sex就是静态成员
Star.sex = '男';
// 静态成员只能通过构造函数来访问,不能用实例访问
console.log(Star.sex);
// 实例 ldh直接访问构造函数中原型对象上的方法
ldh.dance(); // 对象身上系统自动添加一个__proto__指向我们构造函数的原型对象
// 一般,公共属性定义到构造函数中,公共方法我们放到原型对象上。
console.log(ldh.proto === Star.prototype);// 原型__proto_ 指向prototype ,true
// 方法的查找规则:首先看对象是否有dance这方法,有则执行对象上的dance,若无,因为有__proto__的存在,就去构造函数的原型对象prototype上查找。

new在执行时会做四件事

1.在内存中创建一个新的空对象
2.让this指向这个新对象
3.执行构造函数里面的代码,给新对象添加属性和方法
4.返回这个对象(所以构造函数不需要return)

构造函数的问题

每次新实例对象 都会开辟新的内存空间,存在内存浪费的问题。
构造原型对象(prototype)来 解决这个问题
js规定每一个构造函数都有一个prototype对象,这个对象的所有属性和方法都会被构造函数的对象所拥有。
我们可以将那些不变的对象和方法,直接定义在prototype对象上,这样所有的对象的实例都可以共享这些方法。
so,原型是一个对象,构造函数中的prototype属性我们称之为原型对象,原型对象用来共享数据。

对象原型

对象原型 __proto__
对象都有一个属性 __proto__,指向构造函数的prototype原型对象,我们对象可以使用构造函数的prototype的属性,就是因为对象有 __proto__原型的存在。

  • __proto__对象原型与原型对象prototype是等价的
  • __proto__对象原型的意思在于为对象的查找机制提供了方向,但他是非标准属性,实际开发中不可以使用这个属性,它只在内部指向原型对象prototype。

constructor 构造函数

对象原型(__proto__)和构造函数原型对象(prototype)里面都有一个属性constructor属性,称之为构造函数,因为它指回构造函数本身。
constructor主要用于记录该对象引用那个构造函数,它可以让原型对象重新指回原来的构造函数

Star.prototype.dance = function(){
  console.log('跳');
}
// 如果在prototype中需要添加很对方法,采用下面这种写法简洁一些,
// 但是需要让原型对象重新指回原来的构造函数
Star.prototype = {
  // 如果我们修改了原来的原型对象,给原型对象赋值一个对象,则必须手动利用constructor指回原来的构造函数
  constructor:Star,
  dance:function(){
    console.log('跳');
  },
  song:function(){
  }
}

js成员查找机制

1.当访问一个对象属性时,首先查找这个对象本身又没该属性
2.若无,查找它的原型(也就是__proto__指向的prototype原型对象)
3.还无,则查找原型对象的原型(Object.prototype)
4.以此类推一直找到Object为止(null)
5.__proto__的意义就是为对象成员查找提供一个方向

原型链图

image.png

原型对象this指向问题

1.在构造函数中,this指向对象实例
2.原型对象函数中的this指向对象实例
(函数中的this指向调用者)

扩展对象内置方法

Array.prototype.sum = function(){
 var sum = 0;
 for(var i=0;i<this.length;i++){
   sum += i;
 }
 return sum;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容