1. JavaScript原型深入解析
1.1). prototype属性的使用
l 每个函数都有一个prototype属性, 它是一个引用变量, 默认指向一个空Object对象
function fun(){} //alert(fun.prototype); //alert(typeof fun.prototype); |
l 疑问1: 函数的prototype属性有什么作用呢?
l 疑问2: 函数的prototype属性什么时候起作用?
function Person(name, age) { this.name = name; this.age = age; } var p1 = new Person("hello", 11); //为p1添加一个setName方法 p1.setName = function(name){this.name = name;}; p1.setName("world"); //alert(p1.name);
var p2 = new Person("test", 12); //p2.setName("test"); //p2.setName is not a function //alert(p2.name);
//使用prototyp来实现 Person.prototype.setName = function(name){this.name = name;}; p2.setName("test"); alert(p2.name);
var p3 = new Person("hi", 1); p3.setName("tom"); alert(p3.name); |
1.2). prototype属性的分析
l 通过new创建的对象都有一个隐含属性__proto__,
l 当new 构造函数来创建一个对象时,对象的__proto__属性就被赋值为构造函数的prototype属性的值
l 当通过对象.来调用对象的属性或方法时, 先会在自己身上找, 如果没有找到就会在__proto__属性所指向的对象上找, 并依次下去
function Person(name, age) { this.name = name; this.age = age; } var p1 = new Person("hello", 111);
alert(Person.prototype==p1.__proto__);//true
Person.prototype.setName = function(name){this.name = name;}; p1.setName("world");
alert(p1.name); Person p2 = new Person(“A”, 123); |