一、Javascript对象
javaScript 中,万物皆对象!对象是拥有属性和方法的数据。属性是与对象相关的值;方法是能够在对象上执行的动作。但对象也是有区别的。分为普通对象(Object)和函数对象(Function),Object和Function 是JS自带的函数对象。下面举例说明:
function f1() {};
var f2 = function() {};
var f3 = new Function();
console.log(typeof f1); //function
console.log(typeof f2); //function
console.log(typeof f3); //function
var o1 = {};
var o2 = new Object();
var o3 = new f1();
console.log(typeof o1); //object
console.log(typeof o2); //object
console.log(typeof o3); //object
console.log(typeof Object); //function
console.log(typeof Function); //function
其中f1、f2、f3就是函数对象;o1、o2、o3就是普通对象。在js中还有两种值null、undefined,其中null是属于普通对象的,因为 typeof null 值是object;undefined是一种独特的类型不是普通对象也不是函数对象, 因为 typeof undefined 值是undefined。
只要是用Function关键字定义的对象都是函数对象,其他定义的对象都是普通对象。
二、javascript原型
javascript原型又称为js原型对象。在javascript中,每当定义一个对象的时候,对象中都会包含一些预先定义的属性。其中函数对象中一个预定义的属性prototype就是原型对象。注:普通对象是没有prototype原型对象的。
那么原型对象是用来做什么的呢?原型对象主要的作用是用来继承的。
function Person(name) {
this.name = name;
};
Person.prototype.getName = function() {
return this.name;
};
function Student(name, age) {
this.age = age;
};
Student.prototype = new Person("人");
Student.prototype.getAge = function() {
return this.age;
};
var xiaoming = new Student("xiaoming", 12);
xiaoming.getAge(); //12
xiaoming.getName(); //人
三、Javascript原型链
js在创建对象的时候都有一个叫做__proto__的内置属性,用于指向创建它的函数对象的原型对象prototype。
上面的例子中:
console.log(Student.prototype.__proto__ === Person.prototype); //true
console.log(xiaoming.__proto__ === Student.prototype); //true
上面的代码证明的就是对象的__proto__指向的是创建它的函数的原型对象。函数对象__proto__指向的是Function.prototype。
console.log(xiaoming.name); //人
上面的代码就显示了原型链的作用,js中,当一个对象在查找一个属性的时候会先看自身有没有此属性,如果有就返回这个属性,否则就去__proto__指向的对象中查找,有就返回,否则继续去__proto__指向的对象中查找,一直查找到原型链的尽头还有没有就返回undefined。
四、constructor
原型对象prototype中都有一个预定义的constructor属性,用来引用它的函数对象。这是一种循环引用。Person.prototype.constructor === Person; //true
Function.portotype.constructor === Function; //true
Object.prototype.construct === Object; //true
Object.constructor === Function; //true
Function.constructor === Object//false;