类与对象

65 阅读1分钟

###原型模式

//原型模式

function Person() {}

Person.prototype.name = "Nicholase"
Person.prototype.age = 18
Person.prototype.job = "Software Engineer"
Person.prototype.sayName = function() {
    console.log(this.name);
}
let p1 = new Person();
p1.sayName();
let p2 = new Person();
p2.sayName();
console.log(p1.sayName == p2.sayName) //true

// 正常的原型链都会终止与object的原型对象
// Object的原型的原型是null
console.log(Person.prototype.__proto__ === Object.prototype) //true
console.log(Person.prototype.__proto__.constructor === Object) //true
console.log(Person.prototype.__proto__.__proto__ === null) //true

//对象通过__proto__链接到原型对象,它实际上指向prototype
console.log(p1.__proto__ === Person.prototype) //true
console.log(p1.__proto__.constructor === Person) //true

1、理解原型

  • 无论何时只要创建一个函数,就会按照特定的规则为这个函数创建一个prototype属性(指向原型对象)。默认情况下所有原型对象自动获得一个名叫constructor属性,指回与之相关联的构造函数
  • 在自定义构造函数的时候,原型对象默认只会获得constructor属性,其他的所有方法都继承object  

2、原型的层级

  • 再通过对方访问属性时,会按照这个属性的名称开始搜索。
  • 首先、搜索对象实例的本身
  • 如果发现则返回,该名称所对应的值,否则,会搜索会沿着原型指针进入原型对象
  • 只要给对象实例添加一个属性,这个属性就会屏蔽原型对象上的同名属性
  • 删除了对象实例的属性,就会招原型对象的属性
function Person() {}

Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function() {
    console.log(this.name);
}

let person1 = new Person();
let person2 = new Person();

person1.name = "Greg";
console.log(person1.name); //Greg
console.log(person2.name); //Nicholas

delete person1.name;
console.log(person1.name); //Nicholas