在javascript中常常听到一句话叫作一切事物皆对象。
其实得除null和undefined除外 数字也有点特殊看栗子javascript
false.toString();//'false' [1,2,3].toString();//'1,2,3' //数字 (1).toString();//'1' 1 .toString();// '1' 1..toString();// '1' 1.toString();//Unexpected token ILLEGAL //null undefined null.toString();//Cannot call method 'toString' of null undefined.toString();//Cannot call method 'toString' of undefined
数字应该是js引擎解析出错
这里特别注意的是对象也分为普通对象和函数对象,函数对象就是经过new Function建立的对象普通对象就是Object后面讲到原型时会用到。java
var text1={}; var text2={name:'xx',age:'3'} //属性的访问 text2.name//xx text2[name]//undefined text2['name']//xx
对象属性的删除只有delete,去设置它的值为null、和undefined 只是制空 方便gc回收属性仍然存在。编程
var text={name:'xx',age:'3',say:'hello'} text.name=null; text.age=undefined; delete text.say; text;//{name:null,age:undefined}
概念:每当定义个个对象的时候,对象中会包含一些预约义的属性。其中函数对象的一个属性就叫原型对象prototype。
普通对象是没有prototyoe的,但有__proto__属性。
做用:原型对象就是用来作继承用的。
栗子:函数
var person=function(name){ this.name=name; } person.prototype.getName=function(){ return this.name; } var xx=new person('我叫xx'); xx.getName();//经过原型的属性继承了getName方法
至于怎么实现的就得说到原型链了。测试
概念:JS在建立对象的时候无论是普通对象仍是原型对象都有一个叫作__proto__的属性,他用于指向那个建立它的对象的原型prototype。然而建立他的对象也有_proto_这个属性,一样又指向上一层,直到 __proto__这个属性为null为止,这样造成的一条链状就叫原型链 。this
function person(){ } var p=new person(); alert(p.__proto__===person.prototype);//true
new的做用:spa
var p={};//声明个空对象prototype
p.__proto__=person.prototype;//把P__proto__的属性指向person的原型设计
person.call(p);//把this的指针指向p指针
概念:constructor这个属性不会影响内部的任何属性。
只是JavaScript语言设计的历史遗留物。因为constructor属性是能够变动的,因此未必真的指向对象的构造函数,只是一个提示。不过,从编程习惯上,咱们应该尽可能让对象的constructor指向其构造函数,以维持这个惯例。
总结下:说白了一个并没什么太大用的东西!y很不靠谱!很费操做!
理由看栗子1:
//定义构造函数 function person(name){ this.name=name; } //给他原型上添加个方法 person.prototype.say=function(){ console.log(this.name); } //测试下 var p=new person("xx"); alert(p.constructor)
这个栗子没毛病他指向了构造函数。
而后看栗子2:
//定义构造函数 function person(name){ this.name=name; } //给他原型上添加个方法 person.prototype={ say:function(){ console.log(this.name) } } //测试下 var p=new person("xx"); alert(p.constructor)
看吧很不靠谱除非你在去手动的改它的值
来源:它就是经过原型链从Object.prototype那继承过来的。
做用:用来判断一个对象是否包含自定义属性而不是原型链上的属性
上栗子:
Object.prototype.one=1;//先定义一个原型属性one var text={two:2,three:3};//那么全部的普通对象都继承one console.log(text.one);//1 'one' in text;//true 他去找原型链上的属性去了 text.hasOwnProperty('one');//false text.hasOwnProperty('two');//true text.hasOwnProperty('three');//true