JavaScript中的对象

基于对象

JavaScript 是一门基于对象的语言,因为 JavaScript 中大部分内容都是由对象构成的,可以说 JavaScript 就是建立在对象上的语言。
JavaScript 中的对象是指一组组属性和值组成的集合

45

属性描述符

  • configurable:是否可配置(delete,defineObject 是否可以设置成功)
  • enumerable:是否可枚举(forin,Object.keys())
  • value:值
  • writable:是否可改写
  • set:set 访问器
  • get:get 访问器

数据属性:value+writable;访问器属性:set+get一次只能有 4 个属性

关于继承

JavaScript 中使用原型和原型链实现继承。

虽然在 ES6 中引入了 class 关键字,但那只是 function 的一个语法糖,其本质还是 prototype。

JavaScript 中每个对象都有一个proto属性 ,proto指向了内存中另外一个对象,我们就把这个对象称之为对象的原型对象。
236162019-f107b0bb-b9fe-48b8-a22b-60d2f3461d4d

继承的实现

在开发中,我们不推荐直接修改对象的__proto__属性实现继承,而是要使用构造函数。

所有现代的 js 引擎都深度优化了获取和设置对象属性的行为,因为这些都是一些常见的 js 操作。这些优化都是基于引擎对对象结构的认识上。当更改了对象的内部结构(如添加或删除该对象或其原型链中的对象的属性),将会使一些优化失效。修改__proto__属性实际上改变了继承结构本身,这可能是最具破坏性的修改。

new 做了什么?

  • 首先,创建了一个空白对象 `
  • 将 DogFactory 的 prototype 属性设置为 dog 的原型对象,这就是给 dog 对象设置原型对象的关键一步
  • 再使用 dog 来调用 DogFactory,这时候 DogFactory 函数中的 this 就指向了对象 dog,然后在 DogFactory 函数中,利用 this 对对象 dog 执行属性填充操作,最终就创建了对象 dog。
function DogFactory(type,color){
    this.type = type
    this.color = color
}
var dog = new DogFactory('Dog','Black')

=======

var dog = {}
dog.__proto__ = DogFactory.prototype
DogFactory.call(dog,'Dog','Black')

实现继承

使用 prototype 挂载属性,因为对象的proto指向了构造函数的 prototype。

function DogFactory(type, color) {
  this.type = type;
  this.color = color;
  //Mammalia
}
DogFactory.prototype.constant_temperature = 1;
var dog1 = new DogFactory("Dog", "Black");
var dog2 = new DogFactory("Dog", "Black");
var dog3 = new DogFactory("Dog", "Black");
posted @ 2025-11-17 18:43  jinzhepro  阅读(3)  评论(0)    收藏  举报