#Prototype原型对象
原型对象
Function.prototype,具备以下特点:
- 原型对象prototype是构造函数的一个属性。本质上,也是一个对象。
- 所有被构造函数构造出来的实例对象都能继承原型对象上面的属性和方法。所以,当我们在写构造函数的时候,一般会将固定的属性和方法写到原型对象prototype之上,从而,避免代码的冗余。
// 不用传参数的固定属性
Person.prototype = {
book: "《庄子喃哗》",
author: "南怀瑾",
};
function Person(opt) {
this.name = opt.name;
this.age = opt.age;
this.notice = function () {
console.log(`${this.age}岁的${this.name}正在阅读${this.author}的${this.book}`);
};
}
var Tom = new Person({
name: "张三",
age: 8,
});
Tom.notice(); // 打印结果:8岁的张三正在阅读南怀瑾的《庄子喃哗》
# __proto__属性实例化对象属性
__Proto__属性,属于每一个实例对象,而不是某一个构造函数。简单说,JS引擎为了方便实例对象访问构造函数当中的prototype属性,于是,在构造函数生成对象的时候,隐式地生成__proto__属性指向构造函数的Prototype属性。例如:
var obj = new Object(); console.log(obj.__proto__);
__~~__:表示这一属性是JS引擎内置属性,不要轻易修改。
__proto__属性生成原理如下:
Person.prototype = {
book: "《庄子喃哗》",
author: "南怀瑾",
};
function Person(opt) {
// 隐式创建
// var this = {
// __proto__: Person.prototype;
// }
this.name = opt.name;
// return this;
}
var Tom = new Person({ name: "张三" });
// 修改__proto__指向
Tom.__proto__ = { book: "《孟子》" };
console.log(Tom.__proto__.book); // 打印结果:《孟子》
console.log(Tom.book); // 打印结果:《孟子》
console.log(Person.prototype.book); // 打印结果:《庄子喃哗》
#construct构造器
construct构造器是构造函数prototype对象的属性,默认指向构造函数。
例如:
var obj = new Object(); console.log(Object.prototype.constructor === Object)
Book.prototype.name = "西游记";
function Book() {}
var book1 = new Book();
console.log(book1.name); // 打印结果:西游记
Book.prototype.name = "水浒传";
console.log(book1.name); // 打印结果:水浒传
Book.prototype = {
name: "石头记",
};
console.log(book1.name); // 打印结果:水浒传
var book2 = new Book();
console.log(book2.name); // 打印结果:石头记
// 生成对象的时候,__proto__属性的指向就已经确定。
// 整个过程如下:
// function Book() {
// var this = {
// __proto__: Book.prototype
// --> Book.prototype.construct
// --> Book
// --> Book.prototype
// }
// return this;
// }
// 其中,__proto__是对象创建的时候才会重新生成,
// Book.prototype.name = "水浒传",只是修改prototype当中的属性而已,prototype引用地址本身不会变。
// Book.prototype = { name = "石头记" },重写了prototype,内存空间多一份,引用地址也发生了改变。










网友评论