27、创建对象
①工厂模式批量创建对象 缺点:无法对象识别,即所有对象都是Object类型;方法内存空间浪费/封装不太完善
function sayName(){ //可以有效节省内存空间
console.log(this.name);
}
function createObject(name, age, gender){
var obj = {
name:name,
age:age,
gender:gender,
sayName: sayName, //将方法写在外面,可以有效节省内存空间
};
return obj; //或者直接返回对象
}
var o1 = createObject('zhangsan', 12, 'man');
var o2 = createObject('lisi', 15, 'woman');
var dog = createObject('erha', 4, 'man');
console.log(o1, o2, dog);
//通过实例找构造函数
console.log(o1.constructor); //Object
②构造函数模式创建对象
自定义构造函数 问题:方法内存空间浪费/封装不太完善
function sayName(){ //可以有效节省内存空间
console.log(this.name);
}
function Person(name, age, gender){
//this指向new关键字创建的实例
this.name = name;
this.age = age;
this.gender = gender;
sayName: sayName, //将方法写在外面,可以有效节省内存空间
}
var p1 = new Person("terry",11,"man");
console.log(p1)
console.log(p1.constructor); //[Function: Person]
function Dog(name, age, color){
//this指向new关键字创建的实例
this.name = name;
this.age = age;
this.color= color;
sayName: sayName, //将方法写在外面,可以有效节省内存空间
}
var d1 = new Dog("erha",2,"red");
console.log(d1)
console.log(d1.constructor); //[Function: Dog]
③原型模式创建对象
问题: 实例的数据隔离不安全,因为里面的数据共享
function Person(){}
Person.prototype.name = 'zhangsan';
Person.prototype.friends = [];
Person.prototype.sayName = function(){
console.log(this.name);
};
var p1 = new Person();
consoe.log(p1.name); //zhangsan
var p2 = new Person();
consoe.log(p1.name); //zhangsan
p1.friends.push('terry');
console.log(p1.friends); //['terry']
console.log(p2.friends); //['terry']
console.log(p1.sayName === p2.sayName); //true
④组合使用构造函数模式和原型模式
//每个实例自有的放到构造函数中,实例共享的放到原型对象中
function Person(name, age, gender){
//this指向new关键字创建的实例
this.name = name;
this.age = age;
this.gender = gender;
this.friends = [];
}
Person.prototype = { //实例共享的数据
constructor : Person,
sayName:function(){
alert(this.name);
}
}
var p1 = new Person("terry",11,"man");
console.log(p1);
console.log(p1.constructor); //{Function: Person]
var p2 = new Person("larry",11,"woman");
p1.friends.push('hello');
console.log(p1.friends); //['hello']
console.log(p2.friends); //[]
console.log(Person('aaaa')) //undefined, 因为this指针需要指向new关键字,这里只有Person,没有new,所以它没有返回对象,返回的是undefined
28、对象深入了解
①可枚举性:
在打印一个对象,所能看到的属性,这些属性的可枚举性都是true;
for-in循环返回的属性,这些属性的可枚举性也都是true。
②对象的属性类型:
[[Configurable]]: 表示是否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问 器属性直接定义在对象中,默认为true)
[[Enumerable]]: 表示能否通过for-in循环返回属性。(直接定义在对象中,默认为true)
[[Wriable]]: 表示能否修改属性的值。(直接定义在对象中,默认为true)
[[Value]]: 包含这个属性的数据值 name:jacky
③对象的属性特性:
var obj = {
name:'zhangsan',
age:12,
};
console.log(obj); //{name:'zhangsan', age: 12,}
读取属性的特性 Object.getOwnPropertyDescriptor();获取指定属性的描述符该方法接受两个参数, 第一个为属性所在的对象,第二个为要读取其描述符的属性名称
//获取属性的描述信息
console.log(Object.getOwnPropertyDescriptor(obj, 'name')); //{vale: 'zhangsan', writerable:true, enumerable:true, configurable: true}
要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty()方法 defineProperty(属性所在的对象,属性的名字,一个描述符对象);
//修改属性的描述信息
Object.defineProperty(obj, 'name', {
//设置属性不可枚举
enumerable: false, ------->console.log(obj); //{age:12}
//设置属性不可修改
writable:false, -------->obj.name = 'lisi'; console.log(obj.name); //zhangsan
//设置属性值
value:'terry', --------->console.log(obj.name); //terry
//设置属性是否可以删除delete,是否可以重新定义,是否可以配置
configurable:false, --------->别人就不能改变这个属性
})
④访问器属性 没有值,有get方法和set方法, configurable的属性默认为false
var obj = {
name:'zhangsan',
age:12,
_weight:100,
};
Object.defineProperty(obj, 'weight', {
get:function(){
return this._weight-5;
},
set:function(param){
this._weight = param
},
//enumerable:true,
});
/*Object.defineProperty(obj, '_weight', {
enumerable:false
});*/
console.log(obj.weight); //95
obj.weight = 130
console.log(obj.weight); //125
console.log(obj._weight); //130
console.log(obj); // {name:'zhangsan', age: 12, weight: [Getter|Setter]}
console.log(Object.getOwnPropertyDescript(obj, 'weight'));
console.log(Object.getOwnPropertyDescript(obj, '_weight'));
- JS对象与原型
一. JS的对象 1.1 创建对象的几种方式 1.1.1 通过字面量创建对象 在js中,一对{} 其实就是一个对象 var person = { name: "tom", age: ...
- js对象,原型,call,apply浅析
//对象直接量,创建对象最简单的方式是在js里使用对象直接量 var book = { "main title": "js", //属性里有空格,要用引号 &q ...
- JavaScript学习(二)——深入学习js对象的原型与继承
了解对象 什么是对象? …… 这个就不说了 对象的声明的两种方式 var person = new Object(); person.name="linchen"; pers ...
- 深入理解JS对象和原型链
函数在整个js中是最复杂也是最重要的知识 一个函数中存在多面性: 1.它本身就是一个普通的函数,执行的时候形成的私有作用域(闭包),形参赋值,预解释,代码执行,执行完 成后栈内存销毁/不销毁. 2.& ...
- 如何利用fastjson将JSON格式的字符串转换为Map,再返回至前端成为js对象
//注意,这里的jsonStr是json格式的字符串,里面如果遇到双引号嵌套双引号的,一般是嵌套的双引号经过转义 // \",假如有这样的一个场景,这些字符串里面有需要的css样式的j ...
- 前端开发JS——引用类型
10.流程控制语句 注:var obj = {}:这里的obj转换boolean语句为true if语句和java是一样的,判断条件也是根据上篇博客提到的假性值 // 弹出一个带输入框的 ...
- JS对象与原型链
每个函数都存在一个prototype的属性,然后这个属性值为一个对象,我们称之为原型对象 每个对象都存在着一个隐藏的属性"__proto__" 这个属性引用了创建这个对象的函数的p ...
- 前端开发JS白板编程题目若干
在前端开发参加面试的时候,无论是校招还是社招,往往都会碰到让我们直接在白纸或者白板上手撸代码的题目.由于是手撸代码,这些题目肯定不会过于复杂和冗长,否则面试那么一小会时间根本写不完.本文总结了几个我本 ...
- js对象4-js原型--杂志
提问:在js中什么是原型 prototype 每个学js的人都有自己的解释,网上一大堆的解释与应用,但是看了他们的解释表示还是不理解怎么办?(原因是他们说的太天花乱坠了) 官方手册解释:prototy ...
随机推荐
- python使用execjs执行含有document、window等对象的js代码,使用jsdom解决
当我们分析爬虫时,有时候会遇到一些加密参数,这个时候就需要我们逆向分析js python执行js有一些第三方库 https://www.jianshu.com/p/2da6f6ad01f0 因为我用的 ...
- Jmeter-Question之“HTTPS请求”
前面在Jmeter-Question中有提到若干问题,有时间呢,我也会进行继续编写随笔,梳理自己的知识,本篇呢,便来记Jmeter发送https请求的过程 内容大致与http://blog.csdn. ...
- (转)SpringMVC表单多对象传递小技巧——@InitBinder
转:https://www.jianshu.com/p/59771cbf373d 1.问题情景 项目中前端后台的数据传递是必不可少的,比如说我们要在一张表单中提交对象,如果只是一个对象就就很好做,因为 ...
- 网络服务—VSFTP
VSFTP连接类型 控制连接(持续连接)--> TCP21(命令信道)--> 用户收发FTP命令 数据连接(按需连接)-->TCP20(数据信道)--> 用于上传下载数据 ...
- Pwn-TestYourMemory
题目地址 https://dn.jarvisoj.com/challengefiles/memory.838286edf4b832fd482d58ff1c217561 32位的程序,有NX保护,拖到I ...
- ResultMap(还没细看)
前言 MyBatis是基于“数据库结构不可控”的思想建立的,也就是我们希望数据库遵循第三范式或BCNF,但实际事与愿违,那么结果集映射就是MyBatis为我们提供这种理想与现实间转换的手段了,而res ...
- Paper | Compression artifacts reduction by a deep convolutional network
目录 1. 故事 2. 方法 3. 实验 这是继SRCNN(超分辨)之后,作者将CNN的战火又烧到了去压缩失真上.我们看看这篇文章有什么至今仍有启发的故事. 贡献: ARCNN. 讨论了low-lev ...
- linux jdk1.8 32位下载永久地址,ubuntu,centos,java
链接: https://pan.baidu.com/s/16zSC0HZGFjrTAXrW6eyHzg 提取码: cj7m 复制这段内容后打开百度网盘手机App,操作更方便哦
- Azure EA (3) 使用Postman访问海外Azure Billing API
<Windows Azure Platform 系列文章目录> 本文介绍的是海外版的Azure Global服务,因为跨境内境外网络,访问速度会比较慢 在开始使用Azure Billing ...
- redis-5.0.5.tar.gz 安装
参考5.0安装,地址:https://my.oschina.net/u/3367404/blog/2979102 前言 安装Redis需要知道自己需要哪个版本,有针对性的安装. 比如如果需要redis ...