JS 对象

基本概念

JavaScript的基本数据类型,一种复合值,可看做是属性的无序集合。

  • 每个属性都是一个名/值对。
  • 属性名是字符串,因此可以把对象看成是从字符串到值得映射。

对象除了可以保持自有的属性,还可以从一个称为原型的对象继承属性。

  • 原型式继承(prototypal inheritance)是JavaScript的核心特征。

对象是动态的,可以增加或删除属性。
除了字符串、数值、true、false、null和undefined,其他值都是对象。
对象最常见的用法是对其属性进行创建、设置、查找、删除、检测和枚举等操作。

  • 属性值是任意JavaScript值,或者是一个getter或setter函数。

  • 每个属性还有一些与之相关的值,称为“属性特征(property abttribute)”。
    1.可写(writable attribute),表明是否可以设置属性的值。
    2.可枚举(enumerable attribute),表明是否可以通过for/in结构返回该属性。
    3.可配置(configurable attribute),表明是否可以删除或修改该属性。

  • 每个对象还拥有三个相关的对象特性。

    1.对象的原型(prototype),指向另一个对象,该对象的属性会被当前对象继承。
    2.对象的类(class),一个标识对象类型的字符串。
    3.对象的扩展标记(extensible flag),指明了是否可以向该对象添加新属性。

创建对象

1.对象字面量

var obj = {
  name: "object",
  age: 18,
};
console.log(obj.name); // object

2.通过new创建对象

通过new调用构造函数(constructor)来创建并初始化一个新对象。

  • JavaScript语言核心中的原始类型都包含内置构造函数,如Object()、Array()、Date()等。

3.原型
每一个JavaScript对象(null除外)都和另一个对象相关联。

  • “另一个对象”就是原型对象。
  • 每一个对象都从原型继承属性。
// 利用原型创建对象
function Person() {}
Person.prototype.name = "obj";
Person.prototype.age = 21;
Person.prototype.sayHi = function () {
  console.log(`hello`);
};

let per = new Person();
console.log(per.name, per.age); // obj 21
per.sayHi(); // hello

所有通过对象字面量创建的对象都具有同一个原型对象。

  • 通过Object.prototype获得原型对象的引用。

通过new和构造函数创建的对象的原型就是构造函数的prototype属性引用的对象。

  • 如:new Array()对象的原型就是Array.prototype。

极少对象没有原型。

  • 如:Object.prototype,它不继承任何属性。

所有内置构造函数都具有一个继承自Object.prototype的原型。

  • 如:Array.prototype的属性继承自Object.prototype。
  • 通过层级的原型继承形成的链接,称为“原型链”(prototype chain)。
let obj = { value: 2021 };
Object.prototype.flag = "proto";
console.log(obj.flag); // proto
let arr = [1, 2, 3, 4];
console.log(arr.flag); // proto

4.Object.create( )

// obj1继承了属性x和y。
let obj1 = Object.create({ x: 10, y: 10 });
console.log(obj1.x, obj1.y); // 10 10

//obj2不继承任何属性和方法。
let obj2 = Object.create(null);
console.log(obj2); // [Object: null prototype] {}

//obj3是一个普通的空对象。
let obj3 = Object.create(Object.prototype);
console.log(obj3); // {}

JS中prototype,proto,constructor的关系

在JS中,当我们创建一个函数的时候,就根据一组特定的规则给这个函数创建一个prototype属性,这个属性指向这个函数的原型对象。在默认情况下,每个原型对象都会自动获得一个constructor属性,这个属性指向这个函数。

function Person() {}
Person.prototype.name = "wang";
Person.prototype.age = 25;
Person.prototype.sayName = function () {
  console.log(this.name);
};

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

上面的代码中,新建了一个Person对象,然后在Person的原型对象上(Person.prototype)添加了属性和方法,Person的原型对象有个constructor属性,指向Person。通过new Person()创建了两个实例对象person1和person2,person1的__proto__指向的就是Person的原型对象。下图表明了上述关系。
在这里插入图片描述
来源:https://blog.csdn.net/u010176097/article/details/80484890

prototype
  • 每个函数都有一个属性——prototype。这个prototype的属性值是一个对象(属性的集合),默认只有一个叫做constructor的属性,指向这个函数本身。
  • 可以在自己定义的方法的prototype中增加该对象自己的属性。
proto
  • 每个对象都有一个属性——__proto__,这个属性引用了创建这个对象的函数的prototype。
  • 所有函数的__proto__都是指向Function的prototype
  • 构造函数new出来的对象__proto__指向构造函数的prototype

原型继承

原型链是原型对象创建过程的历史记录,当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype中查找,这样一层一层向上查找就会形成一个链式结构。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值