注意:Math是一个静态对象,它不是使用new运算符的构造函数。
字符串、数字和布尔值使用字面量值时,只有在该值被视为对象的情况下才会创建实际的复杂对象。换句话说,在使用与构造函数有关的方法或者属性之前,一直使用原始数据类型。在这种情况下,JavaScript会在为字面量创建一个包装器对象,一边将该值视为一个对象。调用方法结束后,JavaScript即抛弃包装器对象,该值返回字面量类型。
var myStr1 = "foo";
var myStr2 = myStr1;
var myStr3 = "foo";
console.log(myStr2 === myStr3); //结果:true
myStr1 = "test";
console.log(myStr1,myStr2); //结果:test foo
复杂值的复制操作是引用的复制,而不是实际值;比较操作采用引用比较。
示例1:var obj1 = {name : "ligang"};
var obj2 = obj1;
var obj3 = {name : "ligang"};
console.log(obj1 === obj3); //false
obj1.age = 25;
console.log(obj1 === obj2); //true
console.log(obj1,obj2); //Object {name: "ligang", age: 25} Object {name: "ligang", age: 25}
obj1 = {name : "lg"}; //obj1指向新对象,和obj2不再指向同一个对象
console.log(obj1,obj2); //Object {name: "lg"} Object {name: "ligang", age: 25}
var obj1 = new Object('foo');
var obj2 = new Object(function(){});
(2)
var add = new Function('param1', 'param2', 'return param1 + param2');
var sub = new Function('param1, param2', 'return param1 - param2');
var addConstructor = new Function('x' ,'y' ,'return x + y');
function addStatement(x, y){ return x + y; }
var addExpression = function(x, y){ return x + y; };
var myFun = function(x, y, z){
console.log(myFun.length); //形参个数:3
console.log(arguments.callee.length); //形参个数:3
console.log(arguments.length); //实参个数:2
}
myFun(1,2);
var ary = ['foo','bar'];
ary.join(); //原型链:Array.prototype
ary.toLocalString(); //原型链:Object.prototype
var myFun = function(){}
console.log(myFun.prototype); //firefox:Object {} chrome:myFun {}
console.log(typeof myFun.prototype); //Object
Array.prototype.foo = 'foo';
var ary = [];
ary.__proto__.foo; //结果:"foo"
注意:__proto__不是官方ECMA标准的一部分;构造函数属性可用于跟踪从对象到它继承的原型对象的链接!
Array.prototype.bar = 'bar';
var arr = new Array();
console.log(arr.constructor.prototype.bar); //结果:"bar"
console.log(arr.bar); //结果:"bar" bar对象上没有,从继承的原型上获取
var Foo = function Foo(){};
var FooInstance1 = new Foo();
console.log(FooInstance1.constructor); //结果:Foo()
Foo.prototype = {};
var FooInstance2 = new Foo();
console.log(FooInstance2.constructor); //结果:Object()
如果想要替换JavaScript设置的默认prototype属性,应重新连接引用该构造函数的构造函数属性。
示例:var Bar = function Bar(){};
Bar.prototype = {constructor : Bar };
var BarInstance = new Bar();
console.log(BarInstance.constructor); //结果:Bar()
var MyFun = function myFun(){};
MyFun.prototype.x = 1;
var o1 = new MyFun();
MyFun.prototype = { x : 2}
var o2 = new MyFun();
console.log(o1.x); //结果:1
console.log(o2.x); //结果:2