- 单例模式:分组,但不能批量生产
- 工厂模式:把相同的方法放到一个函数中,函数返回一个对象,执行这个函数即可。(函数的封装 -> 低耦合、高内聚)
- 构造函数与工厂模式区别:
- 执行时,构造函数:new 类名();工厂模式:函数名();
- 返回值是类的实例;
- 相同:函数执行时都是先形成一个私有作用域 -> 变量提升 -> 赋值。
- js 中所有的类都是函数数据类型,但本身也是一个普通函数。
实例都是对象数据类型。
- 构造函数执行之前,浏览器会默认创建一个对象数据类型的值,这个对象是实例,接下来, this 代表当前实例,分别把属性名和属性值赋给当前实例。最后浏览器将默认的实例返回。
- 构造函数中如果手动返回值,如果是基本数据类型,当前实例不变,但如果是手动返回引用类型,会把实例替换掉。
- 判断是否是某个类的实例
instanceof
,typeof 不能检测对象数据类型下的 数组、正则、函数.
- in:检测某一个属性是否属于这个对象,不管是私有属性还是公有属性都返回 true。for ... in .. 遍历私有属性及手动添加在原型上的属性。私有属性可枚举,原型上(包括内置和手动添加的属性)的都不可枚举。
propertyIsEnumerable
- hasOwnProperty() 只检测私有属性。
- isPrototypeOf()
- ES5: Object.create(proto,[proertiesObject]):创建一个拥有指定原型和若干属性的对象 。IE6~8 下不兼容。
- 克隆对象:
var obj = {
getX:function(){}
}
var obj2 = {}
for(var key in obj ){
if(obj.hasOwnProperty(key)){
obj2[key] = obj[key];
}
}
var obj3 = Object.create(obj); // 这样克隆将 obj 的属性放到 obj3 的原型上了。
function object(obj){ // 模拟 Object.create()
function Fn(){}
Fn.prototype = obj;
return new Fn();
}
- 自定义数组去重:
Array.prototype.myUnique = function(){
var obj = {};
for(var i = 0; i < this.lenght; i++){
var cur = this[i];
if(obj[cur] == cur){
this[i] = this[this.length - 1];
this.length --;
i--;
continue;
}
obj[cur] = cur;
}
obj = null;
}
var arr = [12,3,23,2,2];
arr.myUnique();
Array.prototype = {
constructor:Array;
unique: function(){
}
}
console.dir(Array.prototype); // 会把之前已经存在于原型上的属性和方法替换,浏览器会屏蔽掉,即不允许这样修改。
Array.prototype.sort=function(){
console.log('333'); // 内置的方法 sort 被修改了。在修改时加特殊的前缀。
}
网友评论