Js对象

  面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同。
  ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数”。严格来讲,这就相当于说对象是一组没有特定顺序的值。对象的每个属性或方法,都有一个名字,而每个名字都映射到一个值(无非就是一组名值对,其中的值可以是数据或函数)。

1.静态类(直接json对象形式,对象字面量)

var Person = {
age : 15,
name : "小明",
say : function( msg ){
console.log( msg );
}
};
console.log(Person.age); //15
Person.say("lala"); //小明

  特点:书写方便,不容易扩展
我们想要仅在该对象内查找的话,为了提高性能,我们可以使用hasOwnProperty()来判断该对象内有没有该属性。

//使用for-in循环
for(var i in Person){
if(Person.hasOwnProperty('name')){
console.log(Person.name); //小明
}
}

  但是我们需要明白的是:for-in循环查找对象的属性,它是不保证顺序的,for-in循环和for循环的最本质的区别是:for循环是有顺序的,for-in循环遍历对象是没有顺序的,如果需要对象保证顺序的话,用for循环遍历即可。

2.构造函数方式:
1) 公有属性,方法(prototype原型链方式)

function Person( name, age ){
this.init( name, age);
}
Person.prototype.init = function( name, age){
this.name = name;
this.age = age;
}
Person.prototype.age = 0;
Person.prototype.name = "";
Person.prototype.say = function( message ){
console.log( message );
}
var xiaoming = new Person('小明', 20);
var xiaohong = new Person('小红', 10);
//alert(xiaoming instanceof Person); //实例化对象是构造函数的实例
console.log(xiaoming.name); //小明
console.log(xiaoming.age); //20
xiaoming.say("我是小明"); //我是小明
console.log(xiaohong.name); //小红
console.log(xiaohong.age); //10

  特点:1.比较像其他有class面向对象编程语言的书写方式,容易接受
  2.在内存中只有一份,提高了程序的执行效率,减少了存储空间
  3.当构造函数被实例化后,所有的实例对象都可以访问构造函数的原型成员,所有的实例方法都可以共享它。
  4.Prototype写的方法不能访问,构造函数里声明的私有方法(缺点)

  我们明白,在原型上增加成员属性或者方法的话,它被所有的实例化对象所共享属性和方法,但是如果实例化对象有和原型相同的成员名的话,那么它取到的成员是本实例化对象,如果本实例对象中没有的话,那么它会到原型中午查找该成员,如果原型找到则返回,否则的话返回underfined。

function B(){
this.name = "BBB"; 如果注销这句,则返回AAA
}
B.prototype.name = "AAA";
B.prototype.getName = function(){
return this.name;
}
var b1 = new B();
console.log(b1.getName()); //BBB

//使用delete运算符删除本地实例属性,那么取到的就是原型属性。
delete b1.name;
console.log(b1.getName()); //AAA

2) 特权属性,方法

function Person2( name, age ){
this.name = name;
this.age = age;
this.say = function( message ){
console.log( message );
};
}
var xiaojun = new Person2('小军', 25);
console.log(xiaojun.name); //小军
console.log(xiaojun.age); //25
xiaojun.say("我是小军"); //我是小军

  特点:每实例化一个对象,就都要在内存中挂载上属性和方法,比较浪费内存,程序执行效率变低。

3) 私有属性,方法

function Person3( name, age ){
var name = name ;
var age = age ;
var say = function( message ){
console.log( message );
};
this.print = function(){ //只能在构造函数内访问
console.log( name );
console.log( age );
};
}
var xiaoli = new Person3('小李', 30); //小李
xiaoli.print(); //30
var xiaoli2 = new Person3('小李2', 40); //小李
xiaoli2.print(); //40

  在Js中由于没有专门写类的class,所以没有private这个私有属性和方法,但是利用js的作用域的特性,我们可以在js构造函数中定义的变量,外部无法访问,所以后人称这为私有属性和方法。
特点:这里的私有属性和方法能被,构造函数、特权函数、私有方法进行访问,公有(prototype原型)不可以访问,说得简单一点就是,只能被构造函数里面定义的函数进行访问。

4) 另一种构造函数,不用new出来的实例对象,用js的特性:

function Person4( name, age ){
var name = name ;
var age = age ;
var say = function( message ){
console.log( message );
};
return { //这边返回出去你要放出去的公有属性和方法
name : name ,
age : age ,
say : say

};
}
var xiaowang = new Person4('小王',18 );
console.log(xiaowang.name); //小王
console.log(xiaowang.age); //18
xiaowang.say('我是小王'); //我是小王

  特点:和特权方式一样,每实例化一个对象,就都要在内存中挂载上属性和方法,比较浪费内存,程序执行效率变低。

文章目录
|