原型链相关

一、创建对象的方法:

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43955911/article/details/88703707