原型/原型和构造函数

对象的原型

1:原型概念:每个对象都有一个[[prototype]],这个属性称之为对象的原型(隐式原型)

浏览器提供__proto__可以看到

2:原型有什么作用 每次查找对象里面的属性时,都会调用[[get]]

第一步先在对象里面查找

第二步对象里面查找不到去原型里面查找

函数的原型(函数也是一个对象 里面也有__proto__)

1:函数因为是一个函数,所以它会多出来一个显示原型属性名字为prototype

!!!new操作会把函数的原型赋值给对象的隐式原型 所以—__proto__才会指着函数的原型prototype

例如:

1 function foo() {
2 
3 }
4 var f1 = new foo()
5 console.log(f1.__proto__ === foo.prototype);

 

2:原型上面都会有一个属性 constructor 指向当前的函数对象

1 function foo() {
2 
3 }
4 var f1 = new foo()
5 console.log(f1.__proto__.constructor);

 

 3:创建对象的内存表表现

 

 4:如果要给原型对象上面添加很多属性,我们可以重写原型对象,这个constructor可以利用Object.defineProperty()来添加

 1 function Person() {
 2 
 3 }
 4 Person.prototype = {
 5     name: '张三',
 6     age: 18,
 7     address: "广州"
 8 }
 9 Object.defineProperty(Person.prototype, 'constructor', {
10     configurable: true,
11     enumerable: true,
12     writable: true,
13     value: '嘿嘿'
14 })
15 var f1 = new Person()
16 console.log(f1.name);
17 console.log(f1.__proto__);
18 console.log(f1.__proto__.constructor);

 

前面已经讲到构造函数创建多个对象的缺点,我们可以通过在函数原型上添加函数来解决这一问题

原型和构造函数:

 1 function Person(name, age, address) {
 2     this.name = name
 3     this.age = age
 4     this.address = address
 5 }
 6 Person.prototype.eating = function() {
 7     console.log(this.name + '在吃饭');
 8 }
 9 var p1 = new Person('张三', 12, '广州')
10 var p2 = new Person('李四', 18, '深圳')
11 var p3 = new Person('王五', 24, '上海')
12 p1.eating()
13 p2.eating()

 

posted @ 2022-03-18 17:04  沁霓  阅读(60)  评论(0)    收藏  举报