创建对象的过程
function Person(name, age) {
this.name = name;
this.age = age;
}
var person = new Person("Marvin", 21);
- 创建一个空对象
var obj = new Object();
- 让Person中的this指向obj,并执行Person的函数体
var result = Person.call(obj);
- 设置原型链,将obj的proto成员指向了Person函数对象的prototype成员对象
obj.__proto__ = Person.prototype;
- 判断Person的返回值类型,如果是值类型,返回obj。如果是引用类型,就返回这个引用类型的对象。
if (typeof(result) == "object")
person = result;
else
person = obj;
创建对象的四种方法
工厂模式
构造函模式
原型模式
混合模式
对象小问题
- 对象的属性的搜索机制
原型对象只分配一次内存
在对象的属性搜索时先搜索自己的属性的列表,假如在属性列表中没有的话就会在自己原型的属性的列表中寻找属性! - 对象属性的屏蔽机制
function Product(){
//属性
this.name='神仙';
// 属性
this.description = ''
this.buy = function(){
alert('构造函数对象')
}
}
Product.prototype={
name:'魔鬼',
buy:function(){
alert('原型对象')
}
}
var product = new Product()
console.log(product.name)// =>'神仙'
//屏蔽掉自己构造函数的中的属性
delete product.name
console.log(product.name)// => '魔鬼'
//屏蔽掉时
console.log(Product.prototype.buy())
单列设计模式
基本模式
//object也称为命名空间【NameSpace】
var object= {
name: name,
.....
}
高级模式
在给命名空间赋值的时候,先执行一个匿名的函数,形成一个私有的作用域A(不销毁占栈内存),在A中创建一个堆内存,把堆内存地址赋值给命名空间,可以在AA中创建内容
var nameSpace = (function(){
var n = 12;
function fn(){
//...
}
return {
fn: fn
}
})()
作用:把属性和方法进行分组归类(存储在同一空间之中,避免了全局变量之间的冲突)
每个命名空间都是jsObject这个内置基类的实例,而这些实例之间都是相互独立的,互不影响。