一文看懂JS创建对象的三种方式
Admin 2021-04-02 群英技术资讯 1515 次浏览
很多人在学习JavaScript时,对于JavaScript创建对象的几种模式不是很理解,这篇文章对工厂模式,构造函数模式,原型模式这三种模式做除了详细介绍,希望对大家学习JS创建对象有所帮助。
工厂是函数的意思。工厂模式核心是定义一个返回全新对象的函数。
function getObj(name, age) {
let obj = {}
obj.name = name
obj.age = age
return obj
}
let person1 = getObj("cc", 31)
缺点:不知道新创建的对象是什么类型
通过一个构造函数,得到一个对象实例。
构造函数和工厂模式区别是:
1,构造函数函数体加了this
2,构造函数没有return
3,构造函数调用时,用new关键字
function CreateObj(name, age) {
this.name = name
this.age = age
}
let person1 = new CreateObj("cc", 31)
console.log(person1)
console.log(person1.constructor === CreateObj); // true
console.log(person1 instanceof CreateObj); // true
关于构造函数的两个问题:
1,构造函数和普通函数唯一区别是调用方式。构造函数要用new关键字。如果不用new,则是往Global对象上加属性。下面例子中,CreateObj方法,往window对象上加了name和age属性
function CreateObj(name, age) {
this.name = name
this.age = age
}
CreateObj('cc', 10)
console.log(window.name) // 'cc'
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: "cc"}
let person2 = {age: 32}
Object.setPrototypeOf(person1,person2)
console.log(person1.name, person1.age); // cc 32
// 以某个对象为原型对象,创建一个新对象
let person1 = {name: "cc"}
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 = "cc"
let person1 = new Person()
console.log(person1.name) // 'cc'
console.log(person1.hasOwnProperty("name")); // false
判断一个对象上是否有个某个属性,用in操作符
// 对象自身 or 原型上找到,都返回true
function Person() {}
Person.prototype.name = "cc"
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 = "cc"
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创建对象的三种方式以及对象方法的介绍,上述的示例代码非常详细,可供大家参考学习。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要给大家介绍JavaScript数组操作filter、find、some、reduce的使用区别,对新手学习JavaScript数组操作有一定的帮助,下文有示例供大家参考,感兴趣的朋友就继续往下看吧。
我们学习了JS 之后,能够用JS实现很多有意思的炫酷效果。这篇文章就给大家分享一个模拟电灯开关的小案例,生活中,我们用手一按就可以让电灯亮起和熄灭,下面我们来看看如何用JS实现点灯开关效果。
在制作网页页面时,轮播图效果是比较常见的,想要实现轮播图效果的方法很多,本文主要介绍的使用jQuery实现轮播图,以下是实现代码,感兴趣的朋友可以了解看看。
这篇文章主要给大家介绍了关于如何利用vue3开发一个打砖块小游戏的相关资料,通过一个小游戏实例可以快速了解vue3开发小游戏的流程,需要的朋友可以参考下
我们在访问购物网站时,经常会看到一些秒杀活动,一般在秒杀活动区域会放置一个倒计时,用作提醒用户活动结束时间。那么这样的倒计时功能是如何实现的呢?下面我们我们就用JavaScript来实现一个简易的倒计时效果,感兴趣的朋友继续往下看吧。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008