JS原型链

#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新时代_打工人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值