<%@ page language="java" contentType="text/html;
charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<script type="text/javascript">
/*
更简单的原型模式以及由此带来的问题:
在本人博客“ js面向对象2--js中工厂模式的演化(重要,详细)”中的原型模式
是最基本也最正确的原型模式的用法,但是每次都用Person.prototype.属性名称
来个原型模式添加方法和属性未免太过繁琐。
为了减少不必要的输入,也为了从视觉上更好的封装原型的功能,更常见的做法是用一个
包含所有属性和方法的对象资源面来重写这个原型对象,如下:
*/
//正常的原型写法:
function Person(){}
Person.prototype.name = "chenchaoyang";
Person.prototype.age = 12;
Person.prototype.job = "Software enginner";
Person.prototype.sayName = function (){
alert(this.name);
}
var person1 = new Person();
//简单的原型写法
function Person(){}
Person.prototype = {
name:"chenchaoyang",
age:"12",
job:"Software enginner",
sayName:function(){
console.log(this.name);
}
}
var person2 = new Person();
function onloadFunction()
{
console.log(person1.constructor); //Person()
console.log(person2.constructor); //Object()
}
/*
在上面代码,我们将Person.prototype 设置为等于一个以对象字面量形式创建的
新对象,最终结果相同,但有一个例外,constructor属性不再指向Person了。
原因:
每创建一个函数,就会同事创建它的prototype对象,这个对象也会自动获得constructor
属性。而我们在这里使用的语法,本质上完全重写了默认的prototype对象,因此constructor
属性也就变成了新对象的constructor属性(指向Object构造函数),不再指向Person函数,
此时尽管instanceof操作符还能返回正确的结果,但通过constructor已经无法确定对象
的类型了。
如果在编程过程中,一个对象的constructor值很重要,可以像下面这样的方法去改写:
*/
function Person(){}
Person.prototype = {
constructor : Person, //人为的制定原型对象的构造函数指向
name : "chenchaoyang",
age :13,
sayName : function(){
alert(this.name);
}
}
/*
注意:以上面的方式重设constructor属性会导致它[[Enumerable]]特性被设置为true。默认
情况下,原声constructor属性是不可枚举的,因此如果你使用兼容EcmAScript5的JavaScript
引擎,可以试一试Object.defineProperty().如下:
function Person(){}
Person.prototype = {
name : "chenchaoyang",
age : 12,
job : "Soft Enginner",
sayName : function(){
console.log(this.name);
}
//重写原型对象的构造函数,只适用于ECMAScript5兼容的浏览器
Object.defineProperty(Person.prototype,"constructor",{
enumerable:false,
value:Person
})
}
此种模式堪称完美。。。。。。。。。Over
*/
</script>
</head>
<body onload="onloadFunction();">
</body>
</html>
分享到:
相关推荐
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式).docx
《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...
JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库
面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码重用为目的的继承模式;BOM、DOM、浏览器事件、AJAX和JSON;如何实现JavaScript中缺失的...
主要介绍了面向对象JS基础讲解,工厂模式、构造函数模式、原型模式、混合模式、动态原型模式,需要的朋友可以参考下
《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...
《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...
JavaScript面向对象基础PPT,讲述了何谓面向对象、面向对象特点、组成及写法、工厂模式、原型以及如何将普通面向过程的代码转换为面向对象的基本原则
在上篇文章给大家介绍了javascript面向对象基础,本篇文章继续深入学习javascript面向对象,JS的语法非常灵活,简单的对象创建就有好几种不同的方法。这些过于灵活的地方有时候确实很让人迷惑,那么今天我们就来梳理...
1.本书是唯一一本介绍JavaScript面向对象编程的图书。, 2.本书作者是知名的Web开发人员和作者。受到国内众多前端开发人员,如淘宝UED团队的推崇和推荐。 Stoyan Stefanov:Facebook公司工程师、作家、演说家。他经常...
构造函数与字面量结合模式、动态原型模式、寄生构造模式、稳妥构造模式、借调函数。 用哪个就把哪个的注释打开哦!
本文主要内容参考来自JavaScript高级程序设计,面向对象与原型章节: 1、工厂模式 ECMAScript 可以通过工厂模式来创建对象: //工厂模式 function createObject(name, age) { var obj = new Object(); //创建对象 ...
在javaScript面向对象设计一和Javascript面向对象设计二中分别介绍了工厂模式和构造函数模式,以及他们格式的优缺点,今天继续讲解原型模式