javascript 对象的创建及 属性
什么对象?:是一组没有特定顺序的值,对象的每个属性或方法都有一个名字,每个名字都映射到一个值。
对象的属性类型
ECMAScript 有两种属性:
数据属性
- configurable 表示能否通过delete 删除
- writable 表示能否修改属性的值
- enumerable 表示能否通过for-in 遍历返回属性
- value 包含这个属性的数据值
访问器属性不包含数据值
- configurable
- enumerable
- get
- set
要
修改属性默认的特性,必须使用Object.defineProperty()方法。方法接收三个参数属性所在的对象,属性的名字,一个描述符对象
# 数据属性有四个
const obj = {
name: "pig",
age: 14,
};
Object.defineProperty(obj, "name", {
writable: false,
value: 42
});
console.log(obj); // { name: 42, age: 14 }
创建对象的方式有哪些?
对象字面量
- 使用同一个接口创建多个对象时,会产生很多的重复代码
new 操作符 + Object 创建对象
- 使用同一个接口创建多个对象时,会产生很多的重复代码
工厂模式
- 解决上面两个创建方式的缺点,
- 但是没有解决对象识别的问题
构造函数模式
- 没有显示的创建对象
- 直接将属性和方法赋给了this对象
- 没有return 语句
原型模式
- 所有对象实例共享它的属性和方法
- 实例自己的属性(方法)(即所谓的私有属性),可以覆盖原型对象上的同名属性(方法)。
构造模式+原型模式
- 构造函数模式 用来定义实列属性,原型模式用于定义方法和共享的属性。
- 支持向构造函数传参数
原型对象
只要创建了一个新函数,就会根据特定的一组规则为该函数创建一个
prototype属性,这个属性指向函数的原型对象。默认情况下,原型对象会自动获得一个
constructor构造函数属性,这个属性指向prototype属性所在函数的指针。
通过 isPrototypeOf()方法来确定对象之间是否存在这种关系
通过 hasOwnProperty()方法可以检测一个属性是存在实列中,还是原型中,只要给定的属性存在对象实列中时,返回true.
in 操作符会在通过对象能够访问给定属性时,返回true,不管该属性时在原型中还是实列中。结合
hasOwnProperty() 和 in 操作符,来判断属性是存在原型中还是实列中。
function sum (){}
undefined
sum.prototype // {constructor: ƒ}
sum.constructor // ƒ Function() { [native code] }
sum.prototype.constructor // ƒ sum (){}
# 结合 hasOwnProperty() 和 in 操作符,来判断属性是存在原型中还是实列中
function hasPtototypeProperty(obj,name){
return !obj.hasOwnProperty(name) && (name in obj)
}
获取对象属性,分可枚举,和不可枚举
for in返回的是所有能够通过对象访问的,可枚举的属性,包含存在实列中的属性,也包含了原型中的属性。
可枚举使用Object.keys(obj),返回包含可枚举属性的字符串数组。
Object.getOwnPropertyNames()获取所有实列属性,会包含不可枚举的属性constructor
本文使用 👉mdnice 排版