1,面向对象常用方法总结
- hasownproperty:用来判断对象是私有属性还是公有
//对象属性私有还是公有判断 hasOwnProperty
function Person ( name, age){
this.name = name ;
this.age = age;
}
//扩展原型
Person.prototype.say = function (){
console.log(this.name);
};
//创建person实例
var person = new Person("tom",28);
//判断属性是否私有
console.log(person.hasOwnProperty("name")); //true
console.log(person.hasOwnProperty("say"));//false,因为say在原型中,属于公有属性
- in关键字
-判断该对象是否可以使用该属性
- in关键字帮我们判断对象是否可以找到和使用某个属性,无论自身还是原型中存在的目标属性,都返回true
console.log("say" in person);//true字符串属性名 +空格+in+实例对象
console.log("sex" in person); //false,找不到sex属性
//为数组扩展size函数,用于返回数组长度
Array.prototype.size = function(){ //数组
return this.length;
};
- 数组越界
//创建数组
var arr = [1,2,3,4,5];
//for in便历数组
for(var n in arr){
if(arr.hasOwnProperty(n)){ //解决方案,不出现函数
console.log(arr[n]);
}
// console.log(n);
//1.2.3,4,5,包含一个fuction。bug,找方法解决,有技术解决,但是不太可行,就是加一个判断,不会挨个去写判断,这也是兼容问题,从全局来看,不建议使用这种方法去解决,一般开发过程中,尽量少使用for in去便历
}
//数组越界,多了一个函数,一定是动了Array数组的原型,
- /Object[keys/getOwnproptyNames],可以获取属性的键集合或者属性集合
var pros = Object.keys(person); //找到的是实例的私有属性
for(var n = 0; n<pros.length; n++){ //变量循环,
console.log(pros[n] +":" +person[pros[n]]); //由于是变量,所以使用对象名+[]获取属性
}
2,内存中的数据数据类型
3,原型链
- 原型链:原型通过继承关系逐级连接组成的链型结构。(这里的继承原型继承,组合继承也是,因为包含原型继承)
- 原型链:原型对象通过原型继承彼此连接组成的链型结构
- 从最下级函数prototype对象开始,由proto_连接各级函数原型组成的链型结构
- 原型链从最下级函数实例proto向上,逐级连接每个函数原型,直到Object函数的原型,而Object函数原型也是一个对象,他的proto_为null
- 构造函数默认都继承自object函数
- 每一个对象(实例),字符串和数字也是对象。都有一个proto属性指向其构造函数的原型。
//原型链顶端是 Object的原型,因为所有构造函数默认都继承该函数。而Object原型也是一个对象,Object.prototype.proto===null
function A(){}
//扩展原型
A.prototype.a = function(){
console.log("这是函数A的原型");
};
//构造函数B
function B(){}
//B继承A
B.prototype = new A();
B.prototype.b = function(){
console.log("这是函数B的原型");
};
//构造函数C
function C(){}
//c继承B
C.prototype = new B();
C.prototype.c=function(){
console.log("这是函数C的原型");
};
- ==对象属性查找原则==:首先查找自身私有属性,有则返回属性值,如果私有属性没有,沿原型链逐级向上查找,优先级逐级降低(就近原则),如果找不到就返回undefined
new 关键字做了哪些事
//创建构造函数
function Person(name , age){
this.name = name;
this.age = age;
}
//自我介绍
Person.prototype.say = function(){
console.log(this.name);
};
//看代码执行用断点
// var person = new Person("tom",28);
- 使用函数模拟new+构造函数创建实例的过程
- 第一步创建对象
- 公有对象(上级函数的prototype属性赋值给新对象的————proto__属性)
- 私有对象c初始化
Person.apply(newObj,arguments);
-返回新对象
function newTest(name, age){
//第一步创建对象
//公有对象
//私有对象c初始化
//返回新对象
var newObj = {};
//建立实例与构造函数的关联
newObj.__proto__= Person.prototype; //空对象的proto属性链接到Person的原型中,解决了公有属性
//构建私有属性
// newObj.name = name;
// newObj.age = age;
// Person.call(newObj,name,age);//把属性放到newObj
Person.apply(newObj,arguments);
//返回新对象
return newObj;
}
console.log(newTest("tom",28));
对象+空串
{}+""//0
{}+100//100
工厂方式创建对象
- 需求,批量创建同类对象
function factory(name,age){
//创建新对象
var newObj = {};
//构建私有属性
newObj.name = name;
newObj.age = age;
newObj.say = function(){
console.log(this.name);
};
//返回新对象
return newObj;
}
//创建实例
var p1 = factory("tom",28);
var p2 = factory("cat",22);