js创建对象有几种方法(javascript中创建对象的几种方式)

本文目录
javascript中创建对象的几种方式
1.对象的字面量的形式var obj = {}
2.new 的方式来调用构造函数的形式
Object是个构造函数var obj = new Object(); obj.name = ’黄忠’
3.工厂方法
function fn (name) {
// 1. 创建一个空对象
var obj = new Object()
// 2. 给对象添加属性和方法
obj.name = name
// 3. 返回一个obj对象
return obj
}
4.构造函数
帕斯卡命名 第一个单词的第一个字母大写,后续的每一个单词的第一个字母都大写
通过this动态的给构造函数添加属性和方法
function Hero(name, weapon, equipment, blood) {
// this 动态的给对象增加成员
// this 指向了当前对象
this.name = name;
this.weapon = weapon;
this.equipment = equipment;
this.blood = blood;
this.attack = function () {
console.log(this.name + ’:攻击’);
}
this.run = function () {
console.log(this.name + ’: 加速跑’);
}
}
var hero1 = new Hero(’黄忠’, ’弓箭’, , 100);
Js创建对象额几种方式
第一种模式:工厂方式
说明:
1.在函数中定义对象,并定义对象的各种属性,,虽然属性可以为方法,但是建议将属性为方法的属性定义到函数之外,这样可以避免重复创建该方法
2.引用该对象的时候,这里使用的是 var x = Parent()而不是 var x = new Parent();因为后者会可能出现很多问题(前者也成为工厂经典方式,后者称之为混合工厂方式),不推荐使用new的方式使用该对象
3.在函数的最后返回该对象
4.不推荐使用这种方式创建对象,但应该了解。
缺点:①无法确定对象的类型(因为都是Object)。
②创建的多个对象之间没有关联。
第二种模式:构造函数方式
说明:
1.与工厂方式相比,使用构造函数方式创建对象,无需再函数内部重建创建对象,而使用this指代,并而函数无需明确return
2.同工厂模式一样,虽然属性的值可以为方法,扔建议将该方法定义在函数之外
3..同样的,不推荐使用这种方式创建对象,但仍需要了解。
缺点:①多个实例重复创建方法,无法共享。
②多个实例均不是同一个Function的实例。
第三种模式:原型模式
说明:
1.函数中不对属性进行定义
2.利用prototype属性对属性进行定义
3.同样的,不推荐使用这样方式创建对象
缺点:①无法传入参数,不能初始化属性值。
②如果包含引用类型的值时,改变其中一个实例的值,则会在所有实例中体现。
第四种模式:混合的构造函数,原型方式(推荐)
说明:
1.该模式是指混合搭配使用构造函数方式和原型方式
2.将所有属性不是方法的属性定义在函数中(构造函数方式)
将所有属性值为方法的属性利用prototype在函数之外定义(原型方式)
3.推荐使用这样方式创建对象
优点:构造函数共享实例属性,原型共享方法和想要共享的属性。可传递参数,初始化属性值。
第五种模式:动态原型方式
说明:
1.动态原型方式可以理解为混合构造函数,原型方式的一个特例
2.该模式中,属性为方法的属性直接在函数中进行了定义,但是因为
从而保证创建该对象的实例时,属性的方法不会被重复创建
3.推荐使用这种模式。
附:JS中多种方式创建对象详解
几种JS创建对象的方式分享
本文主要和大家分享几种JS创建对象的方式,希望能帮助到大家。
1、使用原生构造函数创建特定类型的对象
var person =new Object();
person.name="wangwu";
person.age="20";
person.sayName=function(){
alert(this.name);
}2.用对象字面量
var person = {
name:"wangwu",
age:"20",
sayName: function(){
alert(this.name);
}
}小结:这两种方式都可以用来创建单个对象,但是有明显的缺点,使用同一个接口创建很多对象,会产生大量重复代码。
3.使用工厂模式
function createPerson(name,age){
var o=new Object();
o.name=name;
o.age=age;
o.sayName=function(){
alert(this.name);
};
return o;
}
var person1=createPerson("wangwu",20);抽象了创建具体对象的过程,发明一种函数,用函数来封装以特定接口创建对象的细节。
4、构造函数模式
function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
alert(this.name);
};
}
var person1=new Person("wangwu",20);创建自定义的构造函数,从而定义自定义对象类型的属性和方法。
5、原型模式
function Person(){
}
Person.prototype.name="wangwu";
Person.prototype.age=20;
Person.prototype.sayName=function(){
alert(this.name);
}
var person1=new Person();
person1.sayName(); //wangwu我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。原型模式的缺点是省略了为构造函数传递初始化参数这一环节,结果所有实例在默认情况下都取得相同的属性值;原型中所有属性是被很多实例共享的,对于包含引用类型值的属性来说问题就比较突出了。
6、组合使用构造函数模式和原型模式
function Person(name,age){
this.name=name;
this.age=age;
this.friends=;
}
Person.prototype={
constructor:Person,
sayName:function(){
alert(this.name);
}
}
var person1=new Person("wangwu",20);
var person2=new Person("zhangsan",23);
person1.friends.push("lisi");
alert(person1.friends); //"wangwu,zhangsan,lisi"
alert(person2.friends); //"wangwu,zhangsan"7、动态原型模式
function Person(name,age,job){
//属性
this.name=name;
this.age=age;
this.job=job;
//方法
if(typeof this.sayName!="function"){
person.prototype.sayName=function(){
alert(this.name);
};
}
}
var friend=new Person("wangwu",20);
friends.sayName();8、寄生构造函数模式
function Person(name,age){
var 0=new Object();
o.name="wangwu";
o.age=20;
o.sayName=function(){
alert(this.name);
};
return o;
}
var friend=new Person("wangwu",20);
friend.sayName(); //"wangwu"9、稳妥构造函数模式
function Person(name,age,job){
//创建要返回的对象
var o=new Object();
//可以在这里定义私有变量和函数
//添加方法
o.sayName=function(){
alert(name);
};
//返回对象
return o;
}
var friend=Person("wangwu",20);
friend.sayName(); //"wangwu"

本文相关文章:
打开金蝶提示activex不存在(装了金蝶加密程序后开机弹出ActiveX部件不能创建对象)
2026年7月30日 00:15
创建对象的三种方法?”运行时错误429:activex部件不能创建对象“
2025年12月26日 07:00
440activex部件不能创建对象(activex部件不能创建对象 如何解决)
2025年11月24日 17:30
更多文章:
amaze ui 树状结构导航(网站结构怎么做SEO,树状结构与扁平结构的区别)
2026年4月15日 09:00
jquery多级联动下拉菜单(jQuery实现动态级联选择问题,比如3个下拉框,选择第一个其他的2个选项自动把内容选中.)
2025年9月15日 16:15
vue页面之间回调(vue.http 怎么定义jsonp的回调名)
2026年7月27日 06:30
a和b的ascii码(英文字母A的ASCII码值十进制的是65,那么B的ASCII码是什么)
2026年1月28日 12:30
学51单片机编程选用Keil uvision 和medwin哪个软件更好?为什么没有国产的C/C++的编译器
2025年10月8日 05:45
用fprintf为什么写不进文件(急求C语言大神,下面的程序运行正常也能读取文件,但是无法向文件中写入,问题出在哪)
2025年11月22日 18:45
登陆界面背景图(Win7登录界面背景图在哪里改(输入密码那))
2026年7月27日 18:00
我的世界displayname(minecraft我的世界怎样给物品改名)
2026年1月14日 14:45
shell脚本写加减乘除运算(用shell做个加减乘除运算)
2025年6月20日 21:30
sql语句查询男女生人数(SQL查询,按性别显示学生信息,并分别汇总男生女生人数)
2026年7月25日 08:00










