js学习笔记50——原型对象
上节学到将函数定义在全局作用域。这也是有问题的。
它污染了全局作用域的命名空间。
所以尽量别这么写。
如何处理?
原型对象。
我们创建的每一个函数,解析器都会向函数中添加一个属性prototype,不同的函数的prototype不一样。
<script>
function Person() {
};
function fun() {
};
console.log(Person.prototype==fun.prototype);
console.log(Person.prototype);
console.log(fun.prototype);
</script>
这个属性对应着一个对象,它就是原型对象。
当函数作为普通函数调用,prototype没有任何作用。当函数以构造函数的形式调用时,它所创建的对象都会有一个隐含的属性,指向该构造函数的原型对象。我们可以通过__proto__
来访问该属性。
<script>
function Person() {
};
per= new Person();
console.log(Person.prototype==per.__proto__);
</script>
原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象。
因此我们可以将对象共有的内容统一设置到原型对象中。
当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,如果找到则直接使用。
<script>
function Person() {
};
Person.prototype.a=123
per= new Person();
per2= new Person();
per.a=333;
console.log(per.a);
console.log(per2.a);
</script>
修改上节代码
<script>
function Person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
Person.prototype.sayName= function(){
alert(this.name);
};
var per = new Person("孙悟空",18,"男");
var per2 = new Person("猪八戒",28,"男");
per.sayName();
per2.sayName();
console.log(per.sayName==per2.sayName);
</script>