js创建对象

javascript是基于原型继承的,允许对象继承另一个对象的属性.正确的使用它能减少对象初始化时消耗的时间和内存.

引用

js中对象通过引用来传递.通过=操作符赋值时它们永远不会被复制.

var a = {}, b = {}, c = {};
//a,b和c每个都引用一个不同的空对象
a = b = c = {};
//a,b和c都引用同一个对象

1.创建对象

1.1对象字面量

对象字面量提供了一种非常方便创建新对象值的方法.一个对象字面量就是包围在一对{}.

var obj = {
  name:"object literate"; //添加属性和方法
  getName:function(){   
    return this.name;  //在方法中this指向本对象
  }
};

obj.getName();//object literate
1.2通过原型创建

每个对象都连接到一个原型对象,并且它可以从中继承属性.所有通过对象字面量创建的对象都连接到Object.prototype.
当你创建一个新对象时,你可以选择某个对象作为它的原型.创建一个使用原对象作为其原型的新对象.

if(typeof Object.create !== "function"){
  Object.create = function(obj){
    function F(){};
    F.prototype = obj;
    return new F();
  }
}
var aa = {
  name:"aa"
}
var bb = Object.create(aa);
1.3通过构造函数

如果在一个函数前面带上new来调用,那么会自动创建一个连接到该函数的prototype成员的新对象,同时this会被绑定到那个对象上.
那么使用function怎么解决类型识别问题呢,每个function实例对象都会有一个constructor属性指向其构造函数,
这个属性就可以指示其构造是谁,也可以使用instanceof 操作符来做判断对象是否为该构造函数的实例。

var Person = function(str){
  this.name = str;
  this.getName = function(){
     return this.name;
  }
}
var person1 = new Person("js");
console.log(person1.constructor==Person);//true
console.log(person1 instanceof Person); //true

当使用者没有通过new关键字直接调用时,this会绑定到global对象或者windows对象,可能会发生非常糟糕的事情,即没有编译时警告,也没有运行时警告,所以大写约定非常重要.

var Person = function(name){
if(!(this instanceof Person)) return new Person(name);
  this.name = name;
  this.getName = function(){
     return this.name;
  }
}

1.4原型和构造函数

var person2 = new Person("c++");
console.log(person1.getName === person2.getName);//false
#方法内容虽然相同,但每个实例没有共享方法,浪费内存.
#通过new来调用函数,创建的新对象会连接到该函数的prototype对象
var Person = function(name){
if(!(this instanceof Person)) return new Person(name);
  this.name = name;
}
Person.getName = function(){
   return this.name;
}

1.5函数化

通过构造函数创建的对象属性都是公有的,没法保护隐私.
我们可以通过闭包来完成隐藏属性,因为外部作用域没法访问内部作用域,而内部作用域可以访问外部作用域.

var person = function(name){
  var value = "closure"
  return {
    get_name:function(){
      return name ? name : "confused";
    },
    get_value:function(){
     return value;
  }
  }
}
var aa = person("amazed");
aa.get_name();

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值