详解js创建对象的几种方式和对象方法
这篇文章是看js红宝书第8章,记的关于对象的笔记(第二篇)。
创建对象的几种模式
工厂模式
工厂是函数的意思。工厂模式核心是定义一个返回全新对象的函数。
function getObj(name, age) { let obj = {} obj.name = name obj.age = age return obj } let person1 = getObj("", 31)
缺点不知道新创建的对象是什么类型
构造函数模式
通过一个构造函数,得到一个对象实例。
构造函数和工厂模式区别是
1,构造函数函数体加了this
2,构造函数没有return
3,构造函数调用时,用new关键字
function CreateObj(name, age) { this.name = name this.age = age } let person1 = new CreateObj("", 31) console.log(person1) console.log(person1.constructor === CreateObj); // true console.log(person1 instanceof CreateObj); // true
关于构造函数的两个问题
1,构造函数和普通函数唯一区别是调用方式。构造函数要用new关键字。如果不用new,则是往Global对象上加属性。狼蚁网站SEO优化例子中,CreateObj方法,往window对象上加了name和age属性
function CreateObj(name, age) { this.name = name this.age = age } CreateObj('', 10) console.log(window.name) // ''
2,构造函数存在的问题: 构造函数体内的方法,每次创建一个实例,都会创建一遍。
person1.sayName( ) === person2.sayName( ) // false
解决方法是,将sayName定义在createObj外面。
function sayName() { console.log(this.name) } function CreatePerson(name, age) { this.name = name this.age = age this.sayName = sayName } let person1 = new CreatePerson('joy', 31) person1.sayName()
,这样会让自定义类型引用的代码不能很好聚在一起。
原型模式
原理是,每个函数都有一个prototype属性。prototype是一个对象,里面定义的属性和方法会被所有实例共享。
关于原型模式,有两个等式
function Person() { } let person1 = new Person() console.log(person1.__proto__ === Person.prototype) // true console.log(Person.prototype.constructor === Person); // true
关于原型对象的三个方法isPrototype , getPrototypeof,setPrototypeOf, Object.create()
// isPrototypeOf判断构造函数的原型对象是否是实例的原型对象 function Person() {} let person1 = new Person() console.log(Person.prototype.isPrototypeOf(person1)); // true
// 获取对象的原型对象 function Person() {} let person1 = new Person() console.log(Object.getPrototypeOf(person1) === Person.prototype);
// 将某个对象,设为另一个对象的原型对象 let person1 = {name: ""} let person2 = {age: 32} Object.setPrototypeOf(person1,person2) console.log(person1.name, person1.age); // 32
// 以某个对象为原型对象,创建一个新对象 let person1 = {name: ""} let person2 = Object.create(person1) person2.age = 30 console.log(person2.name, person2.age);
当访问一个对象person的name属性时,是按照以下步骤去访问
1,person上如果有name属性(即便这个属性是null,也会返回null),返回name属性值;没有,继续去原型对象Person.prototype上找
2,如果原型上有name属性,返回原型上name属性值;没有,则返回undefined
判断一个属性是在实例上,还是在原型上,可以用hasOwnProperty
function Person() {} Person.prototype.name = "" let person1 = new Person() console.log(person1.name) // '' console.log(person1.hasOwnProperty("name")); // false
判断一个对象上是否有个某个属性,用in操作符
// 对象自身 or 原型上找到,都返回true function Person() {} Person.prototype.name = "" let person1 = new Person() console.log("name" in person1) // true console.log(person1.hasOwnProperty("name")); // false
访问对象的属性的方法
Object.keys( ) for ... in // 继承属性也会遍历出来 Object.getOwnPropertyNames(obj) // 会列出可枚举和不可枚举属性,其他和 Object.keys( )结果一样 Object.getOwnPropertySymbols(obj) // 和getOwnPropertyNames类似,只是仅针对symbol Reflect.ownKeys(obj) // 和Object.keys( )结果一样
其他访问对象属性和属性值的方法
Object.values( ) 对象值组成的数组,会省掉Symbol型。
Object.entries( ) 对象键值对组成的数组,会将键,转化成字符串,省掉Symbol型。
function Person() {} Person.prototype.name = "" let person = new Person() person.age = 21 let sy = Symbol('sy') person[sy] = 'smile' console.log(Object.values(person)) // [ 21 ] console.log(Object.entries(person)) // [ [ 'age', 21 ] ]
到此这篇关于详解js创建对象的几种方式和对象方法的文章就介绍到这了,更多相关js创建对象内容请搜索狼蚁SEO以前的文章或继续浏览狼蚁网站SEO优化的相关文章希望大家以后多多支持狼蚁SEO!
编程语言
- 宿迁百度关键词排名指南:实现精准营销的关键
- 四川SEO优化怎么做网络推广
- 立昂技术备案老域名收购:如何为您的业务赋能
- 安徽百度关键词seo贵不贵,一般需要多少钱
- 吉林百度快照排名怎么做电话营销
- 多伦新手做SEO怎么做
- 甘肃优化关键词排名推广怎么做论坛营销
- 沙雅SEO网站推广:提升您的在线可见性
- 四川SEO优化如何提升销售额和销售量
- 聂荣网站排名优化:提升网站可见性的全方位指
- 涞水SEO:提升地方企业在线可见性的策略
- 辽宁百度seo排名怎样做网站排名
- 临湘哪有关键词排名优化:提升网站可见度的关
- 黑龙江百度网站优化有没有优惠
- 凉城优化关键词排名推广:提升您的网络可见性
- 萝北整站优化:提升您网站流量和排名的全面指