原型和原型链
构造函数
大写字母开头
function Foo(name, age) {
this.name = name;
this.age = age;
this.class = 'class-1';
//return this //默认有这一行
}
var f = new Foo('zhangsan', 20);
//var f1 = new Foo('lisi', 22) //创建多个对象
构造函数 - 扩展
var a = {} 其实是 var a = new Object() 的语法糖
var a = [] 其实是 var a = new Array() 的语法糖
function Foo(){...} 其实是 var Foo = new Function(...)
使用 instanceof 判断一个函数是否是一个变量的构造函数
原型规则和示例
5条原型规则
原型规则是学习原型链的基础
1、所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性(除了“null”以外)。
var obj = {}; obj.a = 100;
var arr = [];a rr.a = 100;
function fn () {}
fn.a = 100;
2、所有的引用类型(数组、对象、函数),都有一个 __proto__ 属性,属性值是一个普通的对象。隐式原型
3、所有的函数,都有一个prototype属性,属性值也是一个普通的对象。显式原型
4、所有的引用类型(数组、对象、函数),__proto__ 属性值指向它的构造函数的 “prototype” 属性值
5、当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的 __proto__(即它的构造函数的prototype)中寻找。
//构造函数
function Foo(name, age) {
this.name = name;
}
Foo.prototype.alertName = function () {
alert(this.name);
}
//创建示例
var f = new Foo('zhangsan');
f.printName = function () {
console.log(this.name);
}
//测试
f.printName();
f.alertName();
//循环对象自身的属性
var item;
for (item in f) {
//高级浏览器已经在 for in 中屏蔽了来自原型的属性
//但是这里建议大家还是加上这个判断,保证程序的健壮性
if (f.hasOwnPrototype(item)) {
console.log(item);
}
}
原型链
instanceof
用于判断引用类型属于那个构造函数的方法
f instanceof Foo 的判断逻辑是:
f的 __proto__一层一层往上,能否对应到 Foo.prototype
再试着判断f instanceof Object
构造函数
大写字母开头
function Foo(name, age) {
this.name = name;
this.age = age;
this.class = 'class-1';
//return this //默认有这一行
}
var f = new Foo('zhangsan', 20);
//var f1 = new Foo('lisi', 22) //创建多个对象
构造函数 - 扩展
var a = {} 其实是 var a = new Object() 的语法糖
var a = [] 其实是 var a = new Array() 的语法糖
function Foo(){...} 其实是 var Foo = new Function(...)
使用 instanceof 判断一个函数是否是一个变量的构造函数
原型规则和示例
5条原型规则
原型规则是学习原型链的基础
1、所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性(除了“null”以外)。
var obj = {}; obj.a = 100;
var arr = [];a rr.a = 100;
function fn () {}
fn.a = 100;
2、所有的引用类型(数组、对象、函数),都有一个 __proto__ 属性,属性值是一个普通的对象。隐式原型
3、所有的函数,都有一个prototype属性,属性值也是一个普通的对象。显式原型
4、所有的引用类型(数组、对象、函数),__proto__ 属性值指向它的构造函数的 “prototype” 属性值
5、当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的 __proto__(即它的构造函数的prototype)中寻找。
//构造函数
function Foo(name, age) {
this.name = name;
}
Foo.prototype.alertName = function () {
alert(this.name);
}
//创建示例
var f = new Foo('zhangsan');
f.printName = function () {
console.log(this.name);
}
//测试
f.printName();
f.alertName();
//循环对象自身的属性
var item;
for (item in f) {
//高级浏览器已经在 for in 中屏蔽了来自原型的属性
//但是这里建议大家还是加上这个判断,保证程序的健壮性
if (f.hasOwnPrototype(item)) {
console.log(item);
}
}
原型链
instanceof
用于判断引用类型属于那个构造函数的方法
f instanceof Foo 的判断逻辑是:
f的 __proto__一层一层往上,能否对应到 Foo.prototype
再试着判断f instanceof Object