1、工厂模式,解决了创建多个相似对象的问题,但是没有解决对象识别的问题。
function creatPerson(name, age) { var obj = new Object(); obj.name = name; obj.age = age; obj.sayHello = function() { document.write(obj.name + " 的年龄是: " + obj.age); } return obj; } creatPerson("zhangsan", 11).sayHello()2、构造函数模式
function Person(name, age) { this.name = name; this.age = age; this.sayHello = function() { document.write(this.name + " 的年龄是: " + this.age); document.write("<br>"); } } var p1 = new Person("zhangsan", 11); console.log("p1 :",p1); console.log("p1 instanceof Object :",p1 instanceof Object); console.log("p1 instanceof Person: :",p1 instanceof Person); p1.sayHello(); document.write("p1 instanceof Object: "+ p1 instanceof Object); document.write("<br>"); document.write("p1 instanceof Person: "+p1 instanceof Person); document.write("<br>");当使用new创建一个对象要经过以下过程。
- 创建一个新的对象
- 将构造函数的作用域赋值给新对象(this指向了新对象)
- 执行构造函数中的代码
- 返回新对象
构造函数与其他函数的唯一区别,就在于调用他们的方式不同。任何函数只要通过new操作符来调用,那他 就是构造函数
所有的对象均继承自Object对象。
通过call方法修改函数的作用域
var obj = new Object(); Person.call(obj, "obj",12) obj.sayHello();
3、原型模式
由于在原型中的查找是一次搜索,因此对原型的每一次修改能够立刻体现在实例上。但如果重新写整个原型就不行了,因为实例的prototype属性指向原型,但是修改后的原型找不到了。
5、动态原型模式eg.
- 我们创建的每一个函数都有一个prototype属性,这个属性为一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型所有实例共享的属性和方法。这个对象会自动获得一个constructor的属性,这个属性为指向prototype属性所在函数的指针。
- 当调用构造函数创建一个新的实例之后,该实例的内部有一个指向构造函数prototype对象的指针。
- isPrototypeOf 方法用来实例对象的prototype属性是否指向构造函数的prototype对象;Object.getPrototypeOf方法用来获取实例的prototype对象
document.write("Person.prototype.isPrototypeOf(p1) :"+Person.prototype.isPrototypeOf(p1)); //true document.write("<br>") document.write("Object.prototype.isPrototypeOf(p1) :"+Object.prototype.isPrototypeOf(p1));//true document.write("<br>") console.log("Object.getPrototypeOf(p1): ",Object.getPrototypeOf(p1));
- 虽然通过实例对象可以访问原型中的值,但却不能修改原型中的值,如果通过实例修改原型中的值实际是实例中多了一个和原型中一样的属性,实例中的值覆盖了原型中的值。hasOwnProperty方法用来检测实例中是否有某个属性。
function Person() { }; function Teacher(){ this.name = "teacher"; } Person.prototype.name = "zhang"; Person.prototype.age = 11; var t1 = new Teacher(); var p1 = new Person(); var p2 = new Person(); p1.name = "lee"; console.log("p1: ", p1); console.log("p1.name: ", p1.name); console.log("p1: ", p2); console.log("t1.hasOwnProperty name :", t1.hasOwnProperty("name")); console.log("p1.hasOwnProperty name :", p1.hasOwnProperty("name")); console.log("p2.hasOwnProperty name :", p2.hasOwnProperty("name")); console.log("name in p1 :", "name" in p1); console.log("name in p2 :", "name" in p2); delete p1.name; console.log(" delete p1.name"); console.log("p1: ", p1); console.log("p1.name: ", p1.name);
- 原型与in 操作符。in操作符会在通过对象能够访问到给定属性时返回true
- Object.keys得到实例中所有课遍历的字符串数组,Object.getOwnPrototypeNames得到所有实例属性无论是否可枚举。
console.log("Object.keys(p1): ", Object.keys(p1)); console.log("Object.getOwnPrototypeNames(Person.prototype): ", Object.getOwnPropertyNames(Person.prototype));
由于在原型中的查找是一次搜索,因此对原型的每一次修改能够立刻体现在实例上。但如果重新写整个原型就不行了,因为实例的prototype属性指向原型,但是修改后的原型找不到了。
var p1 = new Person(); Person.prototype.tel = 18635581189; document.write("p1.tel: " + p1.tel); Person.prototype = {tian:"234"} document.write("<br>"); document.write("p1.tian: " + p1.tian); document.write("<br>"); var p2 = new Person(); document.write("p2.tian: " + p2.tian); document.write("<br>");
-
问题,对于引用类型有问题。eg.
Person.prototype.arras = ["1"]; var p1 = new Person(); p1.arras.push("p2") var p2 = new Person(); document.write(" 的年龄是: " + p2.arras); document.write("<br>");
function Person(name, age) { this.name = name; this.age = age; }; Person.prototype Person.prototype = { sayHello : function() { document.write(this.name + " 的年龄是: " + this.age) } } Object.defineProperty(Person.prototype, "constructor", { enumerable : false, value : Person }); new Person("zhang",19).sayHello();
5、动态原型模式eg.
function Person(name, age) { this.name = name; this.age = age; if (typeof this.sayHello != "function") { Person.prototype.sayHello = function() { document.write(this.name + " 的年龄是: " + this.age) } } }; new Person("zhang", 19).sayHello();
6、寄生构造函数模式,这种模式下返回的值和构造函数的原型没有关系。
function Person(name, age) { var o = new Object(); o.name = name; o.age = age; o.sayHello = function(){ document.write(o.name + " 的年龄是: " + o.age); } return o; }; var p1 =new Person("zhang", 20); p1.sayHello();
构造函数在不返回值的情况下,默认返回对象的实例。而通过return 可以重写调用构造函数时的返回值。
相关推荐
标题中的"threejs_opengl_javascript_js_ThreeJS_3d_"揭示了我们正在讨论的是一个与Three.js相关的项目,Three.js是一个基于WebGL的JavaScript库,用于在浏览器中创建和展示3D图形。WebGL是一种JavaScript API,它...
本资料包“JS_浏览器对象”包含了对这一主题的深入探讨,适合那些希望增强JavaScript基础知识的学习者。 首先,我们需要理解的是浏览器对象模型(Browser Object Model,BOM)。BOM是一个抽象的概念,它允许...
这篇博客“javascript创建对象的方式(二)”可能详细介绍了在JavaScript中除了最基础的字面量语法之外的其他创建对象的方法。这里我们将深入探讨几种常见的创建对象的方式。 1. **构造函数**: JavaScript中的...
在IT行业中,JavaScript是一种广泛应用的前端编程语言,用于创建交互式的网页和应用程序。在这个场景中,我们关注的是一个名为"js_menu.rar_MENU._javascript_js_menu-collapsed.js_menu_front."的压缩包,它涉及到...
这个名为"js.rar_javascript_js_js 农历_lunar"的压缩包包含了一个专门处理中国农历的JavaScript实例。在这个实例中,开发者仅用了一个文件就实现了农历的计算和展示功能,展现了JavaScript的强大灵活性和高效性。 ...
本文将详细介绍几种常见的创建对象的方法,包括它们的特点和优缺点。 5.1 工厂方法 工厂方法是一种创建对象的模式,通过一个函数来创建具有特定属性和行为的对象。在JavaScript中,我们可以定义一个函数,如`...
JavaScript创建对象的方法主要有以下几种: 一、直接创建 直接创建是通过new Object()来创建一个新的空对象,然后逐步给这个对象添加属性和方法。例如,创建一个名为person1的对象,并添加name、gender属性,以及一...
在JavaScript编程领域,创建用户友好的提示框是增强用户体验的重要环节。"QQ_JS_alert.rar_javascript_js 提示"是一个专为实现类似QQ界面的美观JavaScript提示框组件设计的资源包。这个组件允许开发者在网页应用中...
3. **对象和原型链**:深入理解原型和原型链,包括对象的创建方式、原型对象、__proto__属性、以及如何通过构造函数和Object.create()创建对象,这对于理解和利用JavaScript的面向对象特性十分关键。 4. **函数式...
这篇博文主要探讨了JavaScript创建对象的几种常见方式,这对于理解和掌握JavaScript面向对象编程至关重要。在实际开发中,了解并灵活运用这些方法能够提高代码的可读性和可维护性。下面,我们将详细讲解标题中提到的...
如下所示: 代码如下: var person...上面的例子创建了一个名为person的对象,并为它添加了三个属性(name、age和job)和一个方法(sayName())。其中,sayName()方法用于显示this.name()的值。早期的JavaScript开发人员
JavaScript,简称JS,是一种广泛应用于Web开发的轻量级编程语言,它被设计用来操作HTML文档对象模型(DOM)并实现动态网页效果。在“js.zip”这个压缩包中,我们看到了与JavaScript图形渲染相关的资源,包括“index....
Three.js是一个流行的JavaScript库,专门用于在Web浏览器中创建3D图形。它允许开发者利用WebGL技术,为网页带来丰富的三维视觉体验。 【描述】"基于three.js的html5自动检测小程序" 描述了该项目的核心功能,即一个...
在这些引擎中,C++ 应用程序可以创建一个 Web 浏览器对象,并使用其提供的 API 来执行 JavaScript 代码或者获取 JavaScript 函数的返回值。 - `MFCHtml`, `webbrowser`, `DHTMLDialog-b2` 这些文件可能包含了利用 ...
可以使用对象字面量语法创建对象,如`let obj = {key1: value1, key2: value2}`。数组是特殊类型的对象,可以存储多个值。通过索引访问数组元素,且支持数组方法,如push、pop、shift、unshift、slice、splice等。 ...
Chart.js的核心概念是创建一个canvas元素,并在其中实例化一个图表对象。这通常涉及以下步骤: 1. 引入Chart.js库:在HTML文件中添加Chart.js的CDN链接或者将库文件本地引入。 2. 创建canvas元素:为图表预留一个...
在JavaScript中创建对象的各种模式对于掌握这门语言的面向对象编程特性至关重要。JavaScript作为一门具有面向对象特性的脚本语言,虽然没有传统意义上类的概念,但它通过其他方式实现了对象的创建和继承。在...
"arcgis_js_api"可能包含API的核心库文件,这是构建ArcGIS JavaScript应用程序的基础。在实际项目中,需要将这个库文件引入到HTML页面中,以便使用API的功能。 总结,ArcGIS JavaScript API 3.7是一个强大且全面的...
js对象创建,事件委托测试,this apply call
通过创建Date对象,我们可以获取当前时间,或者设置自定义的日期和时间。例如: ```javascript var today = new Date(); console.log(today); ``` 这段代码将创建一个新的Date对象,表示当前时间,并将其打印出来...