一、创建对象的方法:
1、对象字面量:var obj = {};
2、使用类的实例化方式:var obj = new Person();this添加
3、使用对象的构造函数:var obj = new Object();
4、Object.create();
//第一种 对象字面量
var kind1 = {name: "kind1"};
//第二种 使用类的实例化方式
function Person(name) {
this.name = name;
}
var kind2 = new Person("kind2")
// 第三种 使用对象的构造函数
var kind3 = new Object({name: "kind3"});
// 第四种 Object.create();
var p = {name: "kind4"};
var kind4 = Object.create(p);
结果显示:第四种方法创造的显示为{},p作为原型对象传入
如何用typeof判定bar是对象?
用typeof引用类型时,对象、数组、null三种情况都为object;
解决方法一:
console.log((bar !== null) && (typeof bar === “object”) && (Object.prototype.toString.call(bar) !== “[object Array]”))
解决方法二:
console.log((bar !== null) && (typeof bar === “object”) && (!Array.isArray(bar)))
二、原型、构造函数、实例、原型链
关系:
每创建一个函数,该函数都会自动带有一个prototype属性。该属性是一个指针,指向一个对象,该对象称之为原型对象。
原型对象上默认有一个属性constructor,该属性也是一个指针,指向其相关联的构造函数。
通过调用构造函数产生的实例对象,都拥有一个内部属性__proto__,指向了原型对象。其实例对象能够访问原型对象上的所有属性和方法。
总结:三者的关系是,每个构造函数都有一个原型对象,原型对象上包含着一个指向构造函数的指针,而实例都包含着一个指向原型对象的内部指针。通俗的说,实例可以通过内部指针访问到原型对象,原型对象可以通过constructor找到构造函数。
**原型链**:__proto__属性的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点null,然后返回undefined,通过__proto__属性将对象连接起来的这条链路即我们所谓的原型链。
Js中构造函数与普通函数区别:
1、构造函数也是一个普通函数,但构造函数习惯上首字母大写;
2、构造函数只能由new关键字调用;
3、构造函数可创建实例化对象;
4、构造函数是类的标志;
注意:
①__proto__是对象所独有的;constructor:是原型prototype上的属性,实例上不具有该属性;
② prototype属性是函数所独有的;
但是由于JS中函数也是一种对象,所以函数也拥有__proto__,普通函数是Function的实例;
③Prototype作用就是包含可以由特定类型所有实例共享的属性和方法,让该函数实例化对象都可以找到公用的属性和方法。主要作用就是实现继承与扩展对象。
三、instanceof
A instanceof B 检测A是不是B的实例的原理是:查看对象B的prototype指向的对象是否在对象A的原型链上。如果在,则返回true,如果不在则返回false。
四、new运算符
var Func = function(){ };
var func = new Func ();
经过了4几个阶段:
1、创建一个空对象obj; var obj=new Object();
2、设置原型链:将obj的__proto__指向构造函数Func的原型对象prototype,此时便建立了obj对象的原型链 obj.proto= Func.prototype;
3、让Func中的this指向obj,并执行Func的函数体。 var result =Func.call(obj);
4、判断Func的返回值类型:如果是值类型,返回obj。如果是引用类型,就返回这个引用类型的对象。
简述: ①创建一个新对象; ②与this绑定; ③执行函数代码; ④返回this
if (typeof(result) == "object"){
func = result;
}else{
func=obj;;
}
模拟该过程:
new Animal('cat') = {
var obj = {};
obj.__proto__ = Animal.prototype;
var result = Animal.call(obj,"cat");
return typeof result ==='object'? result : obj;
}