构造函数 对象原型__proto__,原型对象prototype

构造函数

构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总是和new一起使用,可以把对象中一些公共的部分抽取出来,然后封装到这个函数里面;

new 在执行时做的事情

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

静态成员和实例成员

JavaScript 的构造函数中可以添加一些成员,可以再构造函数本身上添加,也可以在构造函数内部的 this 上添加,通过这两种方式添加的成员,分别称为 静态成员 和 实例成员

  • 静态成员:在构造函数本身上添加的成员称为静态成员,只能由构造函数本身访问;
  • 实例成员:在构造函数内部创建的对象成员称为实例成员,只能由实例化对象访问;
function Person(uname, age) {
    // 实例成员定义
    this.uname = uname;
    this.age = age;
    this.sing = function () {};
}
var zs = new Person('zs', 23);
console.log(zs.uname); // 实例成员访问
Person.sex = 'woman'; // 静态成员定义
console.log(Person.sex); // 静态成员访问

构造函数原型 prototype

构造函数中的复杂数据类型(function)会重新开辟内存空间进行存储,随着实例的增加,会产生性能问题;

构造函数通过原型分配的函数是所有对象共享的;JavaScript 规定,每一个构造函数都有一个 prototype 属性;指向另一个对象,注意: 这个 prototype 就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有;我们可以把那些不变的方法,直接定义在 prototype 对象上,这样所有的对象的实例就可以共享这些方法

function Person() {
    this.sing = function () {}
}
Person.prototype.song = function () {console.log('增加共享方法')}
var zs = new Person();
var ls = new Person();
console.log(zs.sing === ls.sing); // false 因为每个实例的对象中的复杂数据类型,都会存放在不同的内存空间
zs.song(); // prototype 方法调用
console.log(zs.song === ls.song); // true 通过原型对象 prototype 共享了 song 方法

对象原型 __proto__

对象都会有一个属性 __proto__ 指向构造函数的 prototype 原型对象,之所以对象可以使用构造函数 prototype 原型对象的属性和方法,就是因为对象有 __proto__ 原型的存在

  • __proto__对象原型和原型对象 prototype 是等价的

    • console.log(zs.__proto__ === Person.prototype); // true
      
  • __proto__对象原型的意义就在于为对象查找机制提供一个方向,或者说一条链路,但是它是一个非标准属性,实际开发中不可以使用,它只是内部指向原型对象的 prototype

猜你喜欢

转载自www.cnblogs.com/article-record/p/12664082.html