标签:function 包含 屏蔽 var 参考 构造 spro 改变 自定义
Javascript面向对象编程一直是面试中的重点,将自己的理解整理如下,主要参考《Javascript高级程序设计 第三版》,欢迎批评指正。
var person_1 = {
name: "userName",
age: 20
}
通过一个构造函数接收参数的方式构造对象,可无数次调用这个函数,通过改变参数构造不同的对象
function createPerson(name,age){
var o = new Object();//创建一个空的对象 -- 原料
o.name = name;
o.age = age;
o.sayName = function(){ //给对象属性赋值 -- 加工过程
alert(this.name)
}
return o; //返回加工后的对象 -- 出厂
}
//var leo = createPerson(‘Leo‘,30);
//leo.sayName(); //"Leo"
//var cherry = createPerson(‘Cherry‘,20);
//cherry.sayName(); //"Cherry"
缺点:工厂模式创建的对象,无法判断其类型
类似Array,Object这种原生的构造函数,我们可以通过创建自定义的构造函数,从而定义自定义对象的类型和方法
function Person(name,age){
this.name = name;
this.age = age;
this.sayName = function(){
alert(this.name);
}
}
var leo = new Person(‘Leo‘,18);
var cherry = new Person(‘Cherry‘,25);
leo.sayName();
cherry.sayName();
通过instanceof检测对象类型,发现通过Person构造函数创建的对象,即使Person类的实例,又是Object对象的实例 - 创建自定义的构造函数表明可以将它的实例标识为一种特定的类型
alert(leo instanceof Person); //true
alert(leo instanceof Object); //true 所有对象都继承自Object
区分构造函数和普通函数
①. 任何函数通过new操作符调用,就可做为构造函数
②. 自定义的构造函数,不通过new调用,与普通函数没有区别
Person(‘window‘,100);//直接调用,相当于将Person类的属性方法直接添加到了this上
window.sayName(); //window
缺点:通过构造函数,每个方法都要在实例上重新创建一遍,每个实例的sayName方法,相当于执行this.sayName = new Function("alert(this.name)")
单独创建出来的
alert(leo.sayName==cherry.sayName);//false
创建的每个函数都有prototype属性,这个属性指向一个其属性和方法由某个特定类的所有实例共享的对象,利用prototype,我们就可将定义对象实例的信息放在原型对象中,不必在构造函数中定义。
function Person(){} //构造函数变成空
Person.prototype.name = ‘Leo‘;
Person.prototype.age =30;
Person.prototype.sayName = function(){
alert(this.name);
}
var person1 = new Person();
var person2 = new Person();
alert(person1.sayName==person2.sayName);//true 将sayName方法定义在Person的prototype属性中,可由多个不同的实例共享
//简化写法:
function Person() { } //构造函数变成空
Person.prototype = {
name: ‘Leo‘,
age: 30,
sayName: function () {
alert(this.name);
}
}
var person1 = new Person();
var person2 = new Person();
只要创建一个新函数,就会为该函数创建一个prototype属性,这个属性指向原型对象。在我们创建的对象person1和person2中都包含一个内部属性,该属性指向Person.prototype,因此两个实例都可以调用原型中的sayName()方法。Object.getPrototypeOf()方法可以更方便的取得一个对象的原型.
alert(Person.prototype.isPrototypeOf(person1));//true
alert(Person.prototype.isPrototypeOf(person2));//true
alert(Object.getPrototypeOf(person1)==Object.getPrototypeOf(person2));//true
给一个对象添加一个属性,这个属性会屏蔽原型对象中存储的同名属性,通过hasOwnProperty()方法可判断是实例对象中的属性,还是原型中的属性;通过in运算符,可以判断在对象上能否找到某属性,而不区分是实例属性还是原型属性,for in循环中只会遍历可访问、可枚举的属性。
person1.name=‘Nancy‘;
alert(person1.name);//Nancy
alert(person1.hasOwnProperty("name"));//True 实例对象上的属性
alert(person2.hasOwnProperty("name"));//false 原型中的属性
alert("name" in person1);//true
alert("name" in person2);//true
for(key in person1){
alert(`${key}:${person1[key]}`)
}
标签:function 包含 屏蔽 var 参考 构造 spro 改变 自定义
原文地址:https://www.cnblogs.com/Nancy-wang/p/9022143.html