纯牛奶645
纯牛奶645
  • 发布:2018-02-10 20:11
  • 更新:2018-02-10 20:11
  • 阅读:2249

js中的对象object

分类:Native.js

对象是JavaScript的基本数据类型。
对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值。
对象也可以看做是属性的无序集合,每个属性都是一个名/值对。
属性名是字符串,因此我们可以把对象看成是从字符串到值的映射。
这种基本数据类型还有很多叫法,有些我们已然非常熟悉,比如“散列”(hash)、“散列表”(hashtable)、“字典”(dictionary)、“关联数组”(associativearray)。然而对象不仅仅是字符串到值的映射,除了可以保持自有的属性,JavaScript对象还可以从一个称为原型的对象继承属性。对象的方法通常是继承的属性。这种“原型式继承”(prototypal inheritance)是JavaScript的核心特征。
JavaScript是动态的———可以新增属性也可以删除属性————但他们常用来模拟静态对象以及静态类型语言中的“结构体”(struct)。有时他们也用做字符串的集合(忽略名/值对中的值)。
除了字符串、数字、true、false、null和undefined之外,JavaScript中的值都是对象。尽管字符串、数字和布尔值不是对象,但他们的行为和不可变对象非常类似。
对象最常见的用法是创建(create)、设置(set)、查找(query)、删除(delete)、监测(test)、枚举(enumerate)它的属性。
用术语对三类JavaScript对象和两类属性作区分:
内置对象:是由ECMAScript规范定义的对象或类。例如:数组、函数、日期和正则表达式都是内置对象。
宿主对象:是由JavaScript解释器所嵌入的宿主环境(比如web浏览器)定义的。客户端JavaScript中表示网页结构的HTMLlement对象均是宿主对象。既然宿主环境定义的方法可以当成普通的JavaScript函数对象,那么宿主对象也可以当成内置对象。
自定义对象:是由运行中的JavaScript代码创建的对象。
自有属性:是直接在对象中定义的属性。
继承属性:是在对象在原型对象中定义的属性。

创建对象的方式:
(1)对象直接量:
var book = {
“main title” : “Javascript”,
“sub-title” :“The Definitive Guide”,
author: {
firstname:“David”,
surname:“Flanagan”
}
};
(2)通过new创建对象
var a = new Array();
var d = new Date();
var r = new RegExp(“js”);
(3)原型
每个JavaScript对象(null除外)都和另一个对象相关联。“另一个”对象就是我们熟知的原型,每一个对象都从原型继承属性。
所有通过对象直接量创建的对象都具有同一个原型对象,并可以通过JavaScript代码Object.prototype获得对象原型对象的引用。通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。因此,同使用{ }创建对象一样,通过new Object()创建的对象也继承自Object.prototype,同样,通过new Array()创建的对象的 原型 就是Array.prototype,通过new Date()创建的对象的 原型 就是Date.prototype.
(4) Object.create( )
var o1 = Object.create({x:1,y:2}); //o1继承了属性的x和y
var o3 = Object.create(Object.prototype); // o3和{ }和new Object()一样
//inherit()返回了一个继承自原型对象p的属性的新对象
//这里使用ECMAScript 5中的Object.create()函数
//如果不存在Object.create(),则退化使用其他方法
function inherit(p) {
if(p === null) throw TypeError(); //p是一个对象,但不能是null
if(Object.create) { //如果Object.create()存在
return Object.create(p); //直接使用它
}
var t = typeof p; //否则进行进一步检测
if(t !== "object" && t !== "function"){
throw TypeError();
}
function f() {}; //定义一个空构造函数
f.prototype = p; //将其原属性设置为p
return new f( ); //使用f()创建p的继承对象
}

属性的查询和设置
可以通过(.)或([ ])运算符来获取属性的值。
作为关联数组的对象
var addr = " ";
for (i = 0; i < 4; i ++){
addr += customer["address" + i] + '\n';
}
这段代码读取customer对象的address0、address1、address2、和address3属性,并将他们连接起来。
很多场景只能使用数组写法来完成。假设你正在写一个程序,这个程序利用网络资源就按当期那用户股票市场投资的金额。程序允许用户输入妹纸股票的名称和购股份额。该程序使用名为portfolio的对象来存储这些信息。每只股票这这个对象中都有对相应的属性,属性名就是股票名称,属性值就是购股数量。例如:如果用户持有IBM的50股,那么portifolio属性的值就为50。
部分代码如下:
function addstock(portfolio,stockname,shares){
protfolio[stockname] = shares;
}
当使用for/in循环遍历关联数组时,就可以清晰地体会到for/in的强大之处。下面的例子就是利用for/in计算portfolio的总计值:
function getvalue(portfolio){
var total = 0.0;
for (stock in portfolio){ //遍历portfilio的每只股票
var shares = portfolio[stock]; //得到每只股票的份额
var price = getquote(stock);//查找股票价格
total += shares * price; //将结果累加至total中
}
return total; //返回total值
}
删除属性
delete云算法可以删除对象的属性。
delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性。
delete云算符只能删除自有属性,不能删除继承属性。
当delete表达式删除成功或没有任何副作用(比如删除不存在的属性)时,它返回true。如果delete后不是一个属性访问表达式,delete同样返回true。
o = {x:1}; //o有一个属性x,并继承属性toString
delete o.x; //删除x,返回true
delete o.x; //什么都没有做,x已经不存在了,返回true
delete o.toString //什么也没做,toString是继承来的,对应第三条,返回true
delete 1; //无意义,返回true
delete不能删除那些可配置性为false的属性。
在以下情况下的delete操作会返回false。
delete Object.prototype; //不能删除,属性是不可配置的。
var x = 1; //声明一个全局变量
delete this.x; //不能删除这个属性
function f(){ }; //声明一个全局函数
delete this.f; //也不能删除全局函数
检测属性
JavaScript对象可以看做属性的集合,我们经常会检测集合中成员的所属关系————判断某个属性是否存在于某个对象中。可以通过in运算符、hasOwnPrepperty()和propertyIsEnumerable()方法来完成这个工作,甚至可以仅通过属性查询也可以做到这一点。
in运算符
var o = {x:1};
"x" in o; //true
"y" in o; //false
"toString" in o; //true:o继承toString属性
hasOwnPreperty()用来检测给定的名字是否是对象的自有属性。对于继承属性它将返回false;
o.hasOwnPreperty("x"); //true
o.hasOwnPreperty("y"); //false
o.hasOwnPreperty("toString"); //false,是继承属性
propertyIsEnumerable()是hasOwnProperty()的增强版,只有检测到是自有属性且这个属性的可枚举性(enumerable attribute)为true时它才会返回true。某些内置属性是不可枚举的。
除了使用in运算符之外,另一种更简便的方式是使用 “!==”判断一个属性是否是undefined:
var o = {x:1};
o.x !== undefined; //true
o.y !== undefined; //false
o.toString !== undefined; //true:o继承了toString属性
!包含了null和undefined,用来判断属性是否存在和是否为空,在书中某一章节有使用。

枚举属性
除了检测对象的属性是否存在,我们还经常会遍历对象的属性。通常使用for/in循环遍历,es5中提供了两个更好的替代方案。
for/in循环可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承的属性),把属性名赋值给循环变量。对象继承的内置方法不可枚举,但在代码中给对象添加的属性都是可枚举的。
var o = {x:1,y:2,z:3}; //三个可枚举的属性
o.propertyIsEnumerable("toString") //false,不可枚举
for(p in o ) //遍历属性
console.log(p) //输出x,y和z,不会输出toString
例子:用来枚举属性的对象的工具函数
/
把p中的可枚举属性复制到o中,并返回o
如果o和p中含有同名属性,则覆盖o中的属性
这个函数并不处理getter和setter以及复制属性
/
function extend(o,p) {
for (prop in p) { //遍历p中所有属性
o[prop] = p[prop]; //将属性添加至o中
}
return o;
}
/

返回一个新对象,这个对象拥有同时在o和p中出现的属性
如果o和p中有重名属性,使用p中的属性值
*/
function union(o,p){return extend(extend({ }, o),p);}

继承
继承的5种方式要单独一篇文章

对象方法
1.toString()方法
m instanceof Array
toString()方法没有参数,它将返回一个调用这个方法的对象值的字符串。在需要将对象转换为字符串的时候,JavaScript都会调用这个方法。比如,当使用“+”运算符连接一个字符串和一个对象时或者在希望使用字符串的方法使用了对象时都会调用toString()。
var s = {x:1,y:1}.toString(); //"[object Object]"
由于默认的toString()方法并不会输出很多有用的信息,因此很多类都带有自定义的toString()方法。

  1. toLocalString()方法
  2. toJSON()方法
  3. valueOf()方法
    valueOf()方法和toString()方法非常类似,但往往当JavaScript需要将对象转换为某种原始值而字符串的时候才会调用它,尤其是转换为数字的时候。尤其是转换为数字的时候。如果在需要使用原始值得上下文中使用了对象,JavaScript就会自动调用这个方法。默认的valueOf()方法不足为奇,但有些内置类自定义了valueOf()方法(比如Date.valueOf())。
    参考:https://segmentfault.com/a/1190000010661297?_ea=3321402
0 关注 分享

要回复文章请先登录注册