yorickshan
2/26/2019 - 12:20 PM

JavaScript 创建对象

对象字面量 new表达式 Object()表达式 Object.create()表达式

对象字面量

var o = { p:"I’m in Object literal", alertP:function(){ alert(this.p); } }

new表达式

function O(){ this.p = "I’m in constructed object"; this.alertP = function(){ alert(this.p); } } var o = new O();

在使用new操作符来调用一个构造函数的时候,发生了什么呢?其实很简单,就发生了四件事:

var obj ={}; obj.proto = CO.prototype; CO.call(obj); return obj;

第一行,创建一个空对象obj。

第二行,将这个空对象的proto成员指向了构造函数对象的prototype成员对象,这是最关键的一步,具体细节将在下文描述。

第三行,将构造函数的作用域赋给新对象,因此CA函数中的this指向新对象obj,然后再调用CO函数。于是我们就给obj对象赋值了一个成员变量p,这个成员变量的值是” I’min constructed object”。

第四行,返回新对象obj。当构造函数里包含返回语句时情况比较特殊,这种情况会在下文中说到。

参考

//无意间看到这段代码 function inheritPrototype(subType,superType){ var prototype = Object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; }

// 以上是原型继承的优化方法 // 看到这个Object顺便追究一下Object这个万物(JS)之本

var obj = Object({ name:"tcc"});//与加new等效 console.log(obj instanceof Object);//true console.log(obj.name);//tcc

var ostr = Object("tcc");//Object构造函数也会像工厂方法一样,根据传入的值的类型返回相应的基本包装类型的实例 ostr.age = 18; console.log(ostr instanceof String);//true console.log(ostr.age);//18 可以存数据

var str = String("tcc");//这是转型函数,其它的还有Nmber()、 Boolean()、 Array() var str = new String("tcc");//这是才是引用类型

function Person(){

  this.name;

}

Person.prototype.age = 12;

var p1 = new Person();

console.log(p1.name); //undefined

console.log(p1.age); //12

-------------------------------------------------

Person.__proto__.age = 34;

var p2 = Object.create(Person);

console.log(p2.name); //Person

console.log(p2.age); //34

//
Object.create =  function (o) {
    var F = function () {};
    F.prototype = o;
    return new F();
};

参考1

参考2