prototype
每个函数都有一个prototype属性,而他的属性值是一个对象,默认只有一个叫做constructor的属性,指向这个函数本身。
原型既然作为对象(属性的集合),除了constructor外,还可以自定义许多属性。
当然了,我们也可以在自己定义的方法的prototype中增加我们自己的属性,比如像下面这样的:
function Fn() { }
Fn.prototype.name = '张三';
Fn.prototype.getAge = function () {
return 12;
};
proto
function Fn() { }
Fn.prototype.name = '张三';
Fn.prototype.getAge = function () {
return 12;
};
var fn = new Fn();
console.log(fn.name);
console.log(fn.getAge ());
即,Fn是一个函数,fn对象是从Fn函数new出来的,这样fn对象就可以调用Fn.prototype中的属性。
但是,因为每个对象都有一个隐藏的属性——“proto”,这个属性引用了创建这个对象的函数的prototype。即:fn.proto === Fn.prototype
那么,这里的_proto_到底是什么呢?
其实,这个__proto__是一个隐藏的属性,javascript不希望开发者用到这个属性值,有的低版本浏览器甚至不支持这个属性值。
obj.__proto__和Object.prototype的属性一样!
每个对象都有一个_proto_属性,指向创建该对象的函数的prototype。
Object.prototype却是一个特例——它的__proto__指向的是null
原型继承
首先说一下什么是原型链:
访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着_proto_这条链向上找,这就是原型链。
参考资料
部分内容转载自胡小小六博客
delete
1.可以删除对象中的属性与方法
删除后访问属性 返回 undefined 访问方法报错
2.不可以删除变量
3.删除不了原型链上的属性与方法
闭包
函数b在a中嵌套 a返回b
用途 读取函数内部的变量 让a中变量的值保留在内存中
优点 可以访问局部变量 缺点 占用内存
声明对象的6种方式
原型继承
构造继承
for in遍历对象
使用构造函数声明的对象要实例化后才可以遍历
i值取的是对象所有属性名称与方法名称
call方法
this
对象冒充
将父类的属性与方法一起传给子类作为特权属性与特权方法
s1.walk()会报错