5站合一 网站建设,桂林市建设工程造价管理站网站,洛阳伟创科技,百度教育官网1. 什么是对象#xff1f;
在 JavaScript 中#xff0c;对象是一种包含属性和方法的数据结构。你可以把对象想象成一个存储键值对的容器。每个键#xff08;key#xff09;都有一个对应的值#xff08;value#xff09;#xff0c;这个值可以是数据或者函数。
let per…1. 什么是对象
在 JavaScript 中对象是一种包含属性和方法的数据结构。你可以把对象想象成一个存储键值对的容器。每个键key都有一个对应的值value这个值可以是数据或者函数。
let person {name: Alice,age: 25,greet: function() {console.log(Hello, my name is this.name);}
};// 访问对象的属性和方法
console.log(person.name); // 输出: Alice
console.log(person.age); // 输出: 25
person.greet(); // 输出: Hello, my name is Alice2. 什么是原型
在 JavaScript 中每个对象都有一个原型prototype。原型是另一个对象所有的对象可以通过原型继承属性和方法。比如JavaScript 中的所有对象默认继承自 Object.prototype而 Object.prototype 本身也是一个对象。
示例继承自 Object.prototype 的方法
let obj {};
console.log(obj.toString()); // 输出: [object Object]在这个例子中obj 是一个空对象。虽然我们没有定义任何属性或方法但它仍然能使用 toString() 方法因为它继承自 Object.prototype其中定义了 toString()。
3. 原型链
当你访问对象的属性时JavaScript 会首先在对象本身查找。如果没找到它会去该对象的原型中寻找。这种逐层查找的机制被称为原型链。
示例通过原型链查找属性
let animal {species: Dog
};let pet Object.create(animal); // pet 继承自 animal
pet.name Buddy;console.log(pet.name); // 输出: Buddy (在 pet 对象本身找到)
console.log(pet.species); // 输出: Dog (在 pet 的原型 animal 中找到)在这里pet 继承自 animal当访问 pet.species 时JavaScript 没有在 pet 本身找到 species 属性于是转而去它的原型 animal 中查找成功找到。
4. 对象原型污染的例子
原型污染的代码示例
let innocentObject {};// 模拟用户输入的对象其中有 __proto__ 属性
let userInput {__proto__: {hacked: Yes, I am hacked!}
};// 合并用户输入到 innocentObject 中
Object.assign(innocentObject, userInput);console.log(innocentObject.hacked); // 输出: undefined
console.log({}.hacked); // 输出: Yes, I am hacked!解释
在代码中userInput 包含 __proto__ 属性这个属性指向一个包含 hacked 属性的对象。使用 Object.assign() 方法将 userInput 合并到 innocentObject 中。虽然 innocentObject 本身没有 hacked 属性但是由于 __proto__ 被修改JavaScript 的原型链被污染Object.prototype 上被注入了一个 hacked 属性。结果是所有对象包括空对象 {}都能访问到这个被注入的 hacked 属性。