Javascript 语言精粹——对象 Object

来源:互联网 发布:js调用苹果摄像头 编辑:程序博客网 时间:2024/06/05 08:40
对象 Object
javascript简单类型:数字、字符串、布尔、null和undefined,其他的为对象。

数组 Arry 是对象
函数 Function 是对象
正则表达式 RegExp 是对象

1、对象字面量

var emptyObj = {};
var user ={
    "name":"Jack",
    "age":"25"
}

2、检索
[] .
var arry=["Jack","2",1,"Mical","Jesse","Jet","Lucy"];
alert(arry["2"])   //1
alert(user['name'])
alert(user.name)


3、更新

user.age=24;
如果对象之前没有相同的属性,那么新的属性将扩充到对象中去。
user.dept="Computer Science"

4、引用

对象通过引用来传递。它们永远不会被拷贝。
var user1 = user;
user1.userName = "Jesse";
var name = user.userName;
alert(name);

5、原型

每个对象都连接到一个原型对象,并且可从中继承属性。
A的原型继承自B的原型,a对象是由A的原型派生出的对象.如果对象a上的一个属性被请求,则js表现出如下搜索过程:
1、js首先检查a对象上是否存在此属性,如果没有搜索到,则进行第2部分搜索过程。
2、js访问A的原型检查是否有此属性,如果仍然没搜到,则进行第3部分搜索过程。
3、js最后访问B的原型检查是否有此属性.如果没有搜到将访问每个对象上的原型直到达到根原型上。这样的一个搜索过程称原型链。


 prototype属性指向构造函数的原型对象,它被用来实现基于原型的继承和共享
var user = {
  age:20,
  name:"Jack"
};
var person = function(){}
person.prototype = user;
var newPerson = new person();
alert(user.name)
var userName = newPerson.name;
alert(userName);

function F() { }   
F.prototype.someProperty = 'prototype property';  
var a = new F();   
alert(a.someProperty);  
a.someProperty = 'object property';   
alert(a.someProperty);   
a.someProperty = undefined;   
alert(a.someProperty);   
delete a.someProperty   
alert(a.someProperty);  
//////
/////
function foo() {
    this.add = function (x, y) {
        return x + y;
    }
}
foo.prototype.add = function (x, y) {
     return x + y + 10;
}

Object.prototype.subtract = function (x, y) {
    return x - y;
 }

var f = new foo();
alert(f.add(1, 2)); //结果是3,而不是13
alert(f.subtract(1, 2)); //结果是-1


hasOwnProperty是判断一个对象是否包含自定义属性而不是原型链上的属性,是JS中唯一一个查找属性,但不查找原型链的函数

6、反射

什么是反射机制
反射机制指的是程序在运行时能够获取自身的信息。例如一个对象能够在运行时知道自己有哪些方法和属性。
在JavaScript中利用for(…in…)语句实现反射
在JavaScript中有一个很方便的语法来实现反射,即for(…in…)语句,其语法如下:
for(var p in obj){
      //语句
}
这里var p表示声明的一个变量,用以存储对象obj的属性(方法)名称,有了对象名和属性(方法)名,就可以使用方括号语法来调用一个对象的属性(方法):
for(var p in obj){
      if(typeof(obj[p]=="function"){
             obj[p]();
      }else{
             alert(obj[p]);
      }
}
这段语句遍历obj对象的所有属性和方法,遇到属性则弹出它的值,遇到方法则立刻执行。在后面可以看到,在面向对象的JavaScript程序设计中,反射机制是很重要的一种技术,它在实现类的继承中发挥了很大的作用。

typeof

hasOwnProperty  该方法不会检查原型链

反射实例:
function setStyle(_style){
      //得到要改变样式的界面对象
      var element=getElement();
      element.style=_style;
}
这样,直接将整个style对象作为参数传递了进来,一个style对象可能的形式是:
var style={
      color:#ffffff,
      backgroundColor:#ff0000,
      borderWidth:2px
}
这时可以这样调用函数:
setStyle(style);
???




这段代码看上去没有任何问题,但实际上,在setStyle函数内部使用参数_style为element.style赋值时,如果element原先已经有了一 定的样式,例如曾经执行过:
element.style.height="20px";
而_style中却没有包括对height的定义,因此element的height样式就丢失了,不是最初所要的结果。要解决这个问题,可以用反射机制来重写setStyle函数:
function setStyle(_style){
      //得到要改变样式的界面对象
      var element=getElement();
      for(var p in _style){
            element.style[p]=_style[p];
      }
}



7、枚举

for in 语句用来遍历一个对象中的所有属性名,该枚举过程将会列出所有的属性,包括函数和其中的原型中的属性。
For...In 声明用于遍历数组或者对象的属性(对数组或者对象的属性进行循环操作)。
一个对象是否可以进行for in穷举,我们可以通过propertyIsEnumerable属性来判断
用for/in语句可以遍历一个对象"可枚举"的属性,但并非一个对象的所有属性都是可枚举的,通过JavaScript代码添加到对象的属性是可枚举的,而内部对象的预定义属性(如方法)通常是不可枚举的.
propertyIsEnumerable()方法不检测原型链,这意味它只适用于对象的局部属性,不能检测继承属性的可枚举性
var obj = {name:'jack'};  
alert('name' in obj); // --> true  
alert('toString' in obj); // --> true  
需要注意的是,虽然in能检测到原型链的属性,但for in通常却不行。当然重写原型后for in在某些浏览器下是可以的。

for 语句

8、删除

delete运算符可以用来删除对象属性,它会移除对象中的属性,但不会触及原型链的任何对象。

9、减少全局变量污染

最小化全部变量的一个方法是创建唯一一个全局变量,其余的视为其属性或者方法。
0 0