美文网首页
对象的原型(四)

对象的原型(四)

作者: 未路过 | 来源:发表于2022-09-04 15:56 被阅读0次

1. 对象的原型理解

image.png

// 我们每个对象中都有一个 [[prototype]], 这个属性可以称之为对象的原型(隐式原型)

var obj = { name: "why" } // [[prototype]]
var info = {} // info里面有这个[[prototype]]对象

// 1.解释原型的概念和看一下原型
// 早期的ECMA是没有规范如何去查看 [[prototype]]

// 给对象中提供了一个属性, 可以让我们查看一下这个原型对象(浏览器提供)
// __proto__
// console.log(obj.__proto__) // {}
// console.log(info.__proto__) // {}

// 就像是var obj = {name: "why", __proto__: {} }

// // ES5之后提供的Object.getPrototypeOf
 console.log(Object.getPrototypeOf(obj))
 console.log(Object.getPrototypeOf(obj) === obj.__proto__)//true


// 2.原型有什么用呢?
// 当我们从一个对象中获取某一个属性时, 它会触发 [[get]] 操作
// 1. 在当前对象中去查找对应的属性, 如果找到就直接使用
// 2. 如果没有找到, 那么会沿着它的原型去查找 [[prototype]]
// obj.age = 18
//obj.__proto__.age = 18

//console.log(obj.age)

2.函数的原型理解(显示原型)

image.png
function foo() {
}

// 1.函数也是一个对象
// console.log(foo.__proto__) // 函数作为对象来说, 它也是有[[prototype]] 隐式原型


// 2.函数它因为是一个函数, 所以它还会多出来一个显示原型属性: prototype,而且对象是没有这个属性的,只有函数有
console.log(foo.prototype)

var f1 = new foo()
var f2 = new foo()

console.log(f1.__proto__ === foo.prototype)
console.log(f2.__proto__ === foo.prototype)

new关键字的步骤如下:

1.在内存中创建一个新的对象(空对象);

2.这个对象内部的[[prototype]]属性会被赋值为该构造函数的prototype属性;(后面详细讲);

那么也就意味着我们通过Person构造函数创建出来的所有对象的[[prototype]]属性都指向Person.prototype:


image.png
48.PNG
49.PNG

3.函数原型上的属性

image.png
image.png
//为啥么呢?因为Person.prototype没有constructor这个属性,就会去Person.prototype.proto 查找,也就是{name: "123",}的.proto ,它指向Object.prototype,Object.prototype的constructor指向Object
     function Person(){ }
     Person.prototype = {
      name:"123"
     }
     console.log(Person.prototype.constructor)//function Object() { [native code] }
     const newObjTest = {}
     console.log(newObjTest.__proto__ === Object.prototype)//true
     console.log(Person.prototype.constructor === Object)//true
image.png
function foo() {

}

// 1.constructor属性
// foo.prototype这个对象中有一个constructor属性
// console.log(foo.prototype)
// console.log(Object.getOwnPropertyDescriptors(foo.prototype))//可枚举是false

// Object.defineProperty(foo.prototype, "constructor", {
//   enumerable: true,
//   configurable: true,
//   writable: true,
//   value: "哈哈哈哈"
// })

// console.log(foo.prototype)

// prototype.constructor = 构造函数本身
// console.log(foo.prototype.constructor) // [Function: foo]
// console.log(foo.prototype.constructor.name)

// console.log(foo.prototype.constructor.prototype.constructor.prototype.constructor)

// 2.我们也可以添加自己的属性
// foo.prototype.name = "why"
// foo.prototype.age = 18
// foo.prototype.height = 18
// foo.prototype.eating = function() {

// }

var f1 = new foo()
console.log(f1.name, f1.age)


// 3.直接修改整个prototype对象(适合于给原型添加东西很多的情况)
foo.prototype = {
  // constructor: foo,
  name: "why",
  age: 18,
  height: 1.88
}

var f1 = new foo()

console.log(f1.name, f1.age, f1.height)

// 真实开发中我们可以通过Object.defineProperty方式添加constructor
Object.defineProperty(foo.prototype, "constructor", {
  enumerable: false,
  configurable: true,
  writable: true,
  value: foo
})

4.创建对象方案-原型和构造函数

function Person(name, age, height, address) {
  this.name = name
  this.age = age
  this.height = height
  this.address = address
}

Person.prototype.eating = function() {
  console.log(this.name + "在吃东西~")
}

Person.prototype.running = function() {
  console.log(this.name + "在跑步~")
}
//this是动态绑定的

var p1 = new Person("why", 18, 1.88, "北京市")
var p2 = new Person("kobe", 20, 1.98, "洛杉矶市")

p1.eating()
p2.eating()
50.png

5.原型链

原型对象也是对象,所以它也有原型
当我们使用一个对象的属性或方法时,会先在自身中寻找,
自身中如果有,则直接使用
如果没有则去原型对象中寻找,如果原型对象中有,则使用
如果没有,则去原型的原型中去寻找,直到找到Object对象的原型,再没有的话,就会返回undefined

6.总结

函数有一个prototype属性,它指向原型对象。原型对象里面有一个constructor属性,指向这个函数自己。

通过函数new出来的对象都有一个__proto__属性,这个属性指向函数的原型对象。

直接通过字面量{}或者new Object出来的对象也是有一个__proto__属性的,它指向Object函数的原型对象。

函数的原型对象也是一个对象,所以它是有一个__proto__属性的,指向Object的原型对象。

Object也是一个构造函数。但是它的原型对象是的__proto__属性是指向null的,这个比较特殊。

53.png

相关文章

  • 对象的原型(四)

    1. 对象的原型理解 2.函数的原型理解(显示原型) new关键字的步骤如下: 1.在内存中创建一个新的对象(空对...

  • javascript原型链详细关系图及总结

    一:构造函数创建对象字面量原型图 二:完整对象字面量原型图 三:数组原型链 四:基本包装类型原型链 总结: 根据以...

  • [Android]《Android 源码设计模式解析与实战》读书

    简介 本书第四章介绍了原型模式。 原型模式介绍 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。被复...

  • javascript中面向对象编程-创建对象之原型模式

    理解名词:对象 原型对象 原型属性 函数 构造函数 实例 对象: Object,创建对象,对象属性方法原型对象:...

  • 📕 原型对象

    基本概念 原型 每一个对象都有它的原型对象,可以使用自己原型对象上的所有属性和方法 原型链 对象有原型,原型也是对...

  • 面向对象之原型对象和其他补充

    原型对象概念 原型对象的作用 如何访问构造函数的原型对象 ① 构造函数.protoType ② 对象.__prot...

  • JavaScript

    原型: 原型对象也是普通的对象,是对象一个自带隐式的 proto 属性,原型也有可能有自己的原型,如果一个原型对象...

  • 对象初始化的不同方式

    不带原型的对象 带原型的对象

  • 原型链

    原型链函数的原型对象prototype函数都有prototype属性指向函数的原型对象【只有函数根除外】原型对象的...

  • JS重要概念之原型与原型链

    #Prototype原型对象 原型对象Function.prototype,具备以下特点:原型对象prototyp...

网友评论

      本文标题:对象的原型(四)

      本文链接:https://www.haomeiwen.com/subject/oklmnrtx.html