原型和原型链知识点整理
根部一些网上和平时学习的内容整理的,希望可以帮到大家,共同学习。
一、原型的规则
1、所有的引用类型(数组,对象,函数),都具有对象属性,即可自由扩展属性(null除外);
2、所有的引用类型(数组、对象、函数),都有一个__proto__属性(__proto__是隐式原型),属性值是一个普遍的对象;
3、所有的函数,都有一个prototype属性(prototype是隐式原型),属性值也是一个普遍的对象;
4、所有的引用类型(数组、对象、函数),__proto__属性值指向它的构造函数的prototype属性;
//eg1:
var obj={};
obj.a=100;
console.log(obj.__proto__===Object.prototype)//true
//eg2:
function Foo(name){
this.name=name;
}
var f1=new Foo('xiaorong');
f1.__proto__===Foo.prototype //true
5、当试图得到一个对象的属性时,如果这个对象本身没有这个属性,那么会去它的__proto__(即它的构造函数的prototype)中寻找。
//eg:
function Foo(name,age){
this.name=name;
this.age=age;
}
Foo.prototype.alertName = function(){
console.log("原型链方法:"+this.name);
}
var f1 = new Foo('Mike',20);
f1.printName = function(){
console.log("自己的方法:"+this.name);
}
(注:f1.__proto__ === Foo.prototype,
Foo.prototype.construtor === Foo,
f1.__proto__.constructor === Foo)
//test
f1.printName();//自己的方法:Mike
f1.alertName();//原型链方法:Mike,f1没有alertName的方法,会到原型链上查找;
f1.toString();//"[object Object]",会到更上一级的原型链上去寻找,f1.__proto__.__proto__......中查找
二、关系图
三、instanceof
作用:用于判断引用类型属于哪个构造函数的方法。
//eg:
typeof 'abc' //"string"
typeof 123 //"number"
typeof false //"boolean"
typeof undefined //"undefined"
typeof null //"object"
typeof [1,2,3] //"object"
typeof {a:1} //"object"
可见typeof不能准确区分对象和数组,都返回了Object
var f1=function(){ console.log(111)}
typeof f1 //"function"
[1,2,3] instanceof Array //true
var obj={'a':1}
obj instanceof Object //true
原理:实例对象-------(instanceof)------->构造函数
//eg:
function Moo(name){
this.name=name;
}
var m1 = new Moo('oo');
m1 instanceof Moo //true
m1 instanceof Object //true,可见instanceof不能判断是直接原型还是间接原型
m1.__proto__ === Moo.prototype //true
Moo.prototype.__proto__ === Object.prototype //true
m1.__proto__.constructor === Moo //true
m1.__proto__.constructor === Object //false,可以看出Moo是m1的直接原型,Object不是
四、new运算符
1、描述new一个对象的过程:
//构造函数
function Foo(name,age){
this.name = name;
this.age = age;
//return this;//默认有这一行
}
var f = new Foo('Mike',25);
过程:
①.创建一个新对象;
②.this指向这个新对象;
③.折行代码,对this赋值;
④.返回this。
2、new运算符的工作原理
var new = function(func){
var o = Object.create(func.prototype);
var k = func.call(o);
if(typeof k==='Object'){
return k;
}else{
return o;
}
}