对象字面量 new表达式 Object()表达式 Object.create()表达式
var o = { p:"I’m in Object literal", alertP:function(){ alert(this.p); } }
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();
};