Javascript创建对象几种方法解析
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Javascript创建对象几种方法解析,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2866字,纯文字阅读大概需要5分钟。
内容图文
Javascript创建对象几种方法解析
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();
- 与工厂模式对比,几点不同:没有现实的创建空对象;直接将属性和方法赋值给this;不需要return
- 通过New操作符创建Person对象的新实例:①创建一个新的对象 ②this指向这个新对象(作用域)③执行构造函数中的代码,对新对象添加属性和方法④返回新对象
-
通过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]}`) }
原文:https://www.cnblogs.com/Nancy-wang/p/9022143.html
内容总结
以上是互联网集市为您收集整理的Javascript创建对象几种方法解析全部内容,希望文章能够帮你解决Javascript创建对象几种方法解析所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。