JS基础知识 (二)--原型规则

构造函数

构造函数其实也是普通的函数,只是可以使用构造函数来实例化对象。
事实上,当任意一个普通函数用于创建一类对象时,它就被称作构造函数。像js的内置函数Object、Array、Date等都是构造函数。
在定义构造函数有以下几个特点:

  • 以大写字母开头定义构造函数
  • 在函数内部对新对象(this)的属性进行设置
  • 返回值必须是this,或者其它非对象类型的值
    举个栗子:定义一个简单的、标准的构造函数
function Obj(){
    this.name = 'name'
    return this // 默认有这一行 
}
var foo = new Obj() // 使用上面定义的构造函数创建一个对象实例
原型规则

js原型有5条原型规则,这5条原型规则是学习原型链的基础

  1. 所有的引用类型(数组, 对象,函数),都具有对象特性,即可自由扩展属性(除了"null"以外)
  2. 所有引用类型都有一个__proto__属性(隐式原型属性),__proto__是一个普通的对象
  3. 所有的函数都有一个prototype属性(显式原型属性),也是一个普通对象
  4. 所有的引用类型(数组, 对象,函数),__proto__属性值指向它的构造函数的prototype属性值
    5.当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么就会去它的 __proto__(即它的构造函数的prototype)中寻找
    示例:
// 规则1
var obj={};obj.a=100;
var arr=[];arr.a=100;
function fn (){}
fn.a = 100;
// 规则 2
console.log(obj.__proto__);
console.log(arr.__proto__);
console.log(fn.__proto__);
//  规则3
console.log(fn.prototype)
// 规则4
console.log(obj.__proto__===Object.prototype)
//规则 5
function Foo(name,age) {
    this.name = name
}
Foo.prototype.alertName=function(){
    alert(this.name)
}
var f=new Foo('zhang san')
f.printName=function(){
    console.log(this.name)
}

f.alertName()
f.printName()

补充:循环对象自身的属性

for(var i in f){
    //高级浏览器已经在for in 中屏蔽了来自原型的属性
    // 但是这里建议大家还是加上这个判断,保证程序的健壮性
    if(f.hasOwnProperty(i)){
        console.log(i)
    }
}

// 输出
 name
 printName

你可能感兴趣的:(JS基础知识 (二)--原型规则)