原型
- 所有的引用类型(对象、数组、函数)都可以随意扩展属性(null除外)
var a = {};
a.a=1
a.b='abc'
a.c=function(){}
- 所有的引用类型都有一个__proto__(隐式原型)属性
var a = {};
console.log(a.__proto__)
- 所有的函数都有一个prototype(显示原型)属性
var foo = function(){};
console.log(foo.prototype)
4.所有的引用类型(数组、对象、函数),__proto__属性指向其构造函数的prototype属性值
console.log(a.__proto__ === Object.prototype)
5.当获取对象的属性时,如果对象本身没有这个属性,就会去它的__proto__(即它的构造函数的prototype)中寻找
function Foo(name){
this.name = name;
}
Foo.prototype.sayName = function(){
alert(this.name);
}
var foo = new Foo('zhangsan');
foo.sayName();
补充:
1.遍历对象自身属性
function bianli(f){
var item;
var list = [];
for(item in f){
if(f.hasOwnProperty(item)){
list.push(item);
}
}
return list;
}
原型链
function Foo(name){
this.name = name;
}
Foo.prototype.sayName = function(){
alert(this.name);
}
var foo = new Foo('zhangsan');
foo.sayName();
/*
* foo的__proto__中并不存在toString()
* 由于foo.__proto__实质上也是一个对象,所以会继续向它的原型上查找
* foo.__proto__.__proto__ === Object.prototype
* 最终在Object.prototype上找到了 toString方法
* 也就是 foo.__proto__.__proto__上找到了toString()
*/
foo.toString();
image.png
补充:
1.为避免死循环
Object.prototype.__proto__ === null
image.png
2.instanceof 是用于判断引用类型属于哪个构造方法的方法
/*
* 逻辑 :
* 从foo.__proto__上能否查找到foo.__proto__===Foo.prototype
* 找到则返回true否则false
* 由于foo.__proto__=== Foo.prototype
* 由于foo.__proto__.__proto__=== Object.prototype
*/
console.log(foo instanceof Foo) //true
console.log(foo instanceof Object) //true
面试题
image.pngvar f = [];
f instanceof Array; //true
typeof f; //Object 注意:无法使用typeof 判断
function People(name,age){
this.name = name;
this.age = age;
}
function Man(){
this.sex = 'Male';
}
Man.prototype = new People();
var lisi = new Man();
lisi.name = 'lisi';
lisi.age = '18';
console.log(lisi.name+lisi.age);
console.log(lisi instanceof People); //true
网友评论