您的位置:首页 > 移动开发 > Objective-C

Javascript 语言精粹——对象 Object

2014-05-23 08:46 363 查看
对象 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、减少全局变量污染

最小化全部变量的一个方法是创建唯一一个全局变量,其余的视为其属性或者方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: