var obj1 = {}
obj1.name = 'Nancy'
obj1.age = 23
obj1.sayHi = function() {
console.log('Hello world!')
}
var obj2 = new Object()
obj2.name = "Mike"
obj2.age = 24
obj2.sayHi = function() {
console.log('Hello world!')
}
//工厂函数创建对象
function createObj(name, age){
var obj = {}
obj.name = name
obj.age = age
obj.sayHi = function(){
console.log('Hello world!')
}
return obj
}
var obj3 = createObj('Lilei', 25)
new
关键字一起使用才有效果function CreateObj(name, age){
this.name = name
this.age = age
this.sayHi = function() {
console.log('Hello world!')
}
}
//静态成员
CreateObj.PI = '3.1415926';
CreateObj.max = function(){
if(arguments.length == 0) {
return null;
}
var max = arguments[0];
var arr = [...arguments];
arr.forEach(function(item, index, arr){
if(max < item) {
max = item;
}
});
return max;
}
var obj4 = new CreateObj('Tom', 26)
console.log(CreateObj.PI);
console.log(CreateObj.max(2, 4))
每一个函数都有一个隐藏对象prototype
(原型),构造函数是一种特殊的函数,所以他也有隐藏对象prototype
如果对象的方法我们写在构造方法内,那么每创建一个对象就要加载这个方法
,如果我们把方法写在原型上,则所有的对象共用一个方法,节省了内存开支
因此:
每个实例对象都有一个隐藏属性:__proto__
(原型对象)
由此引发三个问题:
p
Person
__proto__
指向谁?p.__proto__ => Person.prototype
__proto__
指向谁?(类型是函数)Person.__proto__ => Function.prototype
prototype
,它身上的__proto__
指向谁?(类型是Object
)Person.prototype.__proto__ => Object.prototype
Object
构造函数也是对象,它身上的__proto__
指向谁?(类型是函数)Object.__proto__ => Function.prototype
Object
构造函数的原型对象prototype
,它身上的__proto__
指向谁?(类型是Object
)Object.prototype
属于顶级原型,它已经没有__proto__
了,它的__proto__ = null
(特殊)Function
构造函数也是对象,它身上的__proto__
指向谁?(类型是函数)Function.__proto => Function.prototype
(特殊)Function
构造函数的原型对象prototype
,它身上的__proto__
指向谁?Function.prototype.__proto => Object.prototype