#1.什么是原型链?
function Foo(name,age) {
this.name = name;
this.age=age;
}
Foo.prototype.show = function() {
console.log('you name is', this.name);
};
Foo.prototype.hide=function(){
console.log('you age is',this.age)
}
var f1 = new Foo('张三');
f1.show();
console.dir(f1)
JavaScript是面向对象的,每个实例对象都有一个__proto__属性,该属性指向它的原型对象,这个实例对象的构造函数有一个原型属性prototype,与实例的proto属性指向同一个对象。当一个对象在查找一个属性的时候,自身没有就会根据__proto__向它的原型进行查找,如果都没有,则向它的原型的原型继续查找,直到查到Object.prototype.proto_为null,这样也就形成了原型链。
这说明一个对象所拥有的属性不仅仅是它本身拥有的属性,它还会从其他对象中继承一些属性。当js在一个对象中找不到需要的属性时,它会到这个对象的父对象上去找,以此类推,这就构成了对象的原型链。
##工厂模式
###减少资源浪费
function Father(name,age){
this.name=name;
this.age=age
}
Father.prototype.sex='男';//共同属性
var name1=new Father('张三',18);
var name2=new Father('李四',20);
name1.sex='女';
console.log(name1)
console.log(name2)
#2.原型链污染
如果攻击者控制并修改了一个对象的原型,那么将可以影响所有和这个对象来自同一个类、父祖类的对象。这种攻击方式就是原型链污染。
let info={name:"张三"};
console.log(info.name)//张三
info.__proto__.name="李四";
console.log(info.name);//张三
let info_2={};
console.log(info_2.name)//李四
#原型链污染预防
##使用Object.create(null)进行处理
let info=Object.create(null,{
name:{value:"张三"},
});
info.name="llll"
console.log(info.name)//张三
info.__proto__.name="李四";//报错
console.log(info.name);//张三
let info_2={};
console.log(info_2.name)
#补充
只有函数有prototype,对象是没有的。
但是函数也是有proto的,因为函数也是对象。函数的proto指向的是Function.prototype。
##console.dir()是什么?与console.log()区别?
var object={name:"张三"};
使用console.dir(object);
console.log();//打印数据到浏览器的控制台中。
console.dir();//显示一个对象的所有属性+方法;
console.warn();
console.error();
console.able();
......
#扩展 深冻结函数.
function deepFreeze(obj) {
// 取回定义在obj上的属性名
var propNames = Object.getOwnPropertyNames(obj);
// 在冻结自身之前冻结属性
propNames.forEach(function(name) {
var prop = obj[name];
// 如果prop是个对象,冻结它
if (typeof prop == 'object' && prop !== null)
deepFreeze(prop);
});
// 冻结自身(no-op if already frozen)
return Object.freeze(obj);
}
obj2 = {
internal: {}
};
deepFreeze(obj2);
obj2.internal.a = 'anotherValue';
obj2.internal.a; // undefined
5万+

被折叠的 条评论
为什么被折叠?



