`
Supanccy2013
  • 浏览: 223659 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

js面向对象3--更简单的原型模式已经带来的问题以及解决办法

阅读更多
<%@ 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>
分享到:
评论
3 楼 Cobain_LI 2016-11-19  
Cobain_LI 写道
学习了,之前一直都没注意到有这样的问题

方法用错了, 尴尬,博主事对的
Person.prototype.propertyIsEnumerable("constructor");//true
2 楼 Cobain_LI 2016-11-19  
Cobain_LI 写道
学习了,之前一直都没注意到有这样的问题

还有,那个constructor属性设置之后就是不可枚举的吧,不需要在设置它的enumerable标签了
Person.prototype.constructor.propertyIsEnumerable();//false
var cc=new Person;
cc.constructor.propertyIsEnumerable();//false
1 楼 Cobain_LI 2016-11-13  
学习了,之前一直都没注意到有这样的问题

相关推荐

    js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式).docx

    ### JavaScript面向对象之常见创建对象的方式 #### 引言 JavaScript 的灵活性体现在其创建对象的多种方式上。本文将详细介绍三种常见的对象创建方法:工厂模式、构造函数模式以及原型模式,并探讨它们各自的优缺点...

    JavaScript 面向对象与原型

    以下是对JavaScript面向对象和原型机制的详细解释: 1. 面向对象的基本概念: - 类:在许多面向对象语言中,类是创建对象的模板,但在JavaScript中没有类的概念。 - 对象:JavaScript中的对象是一组键值对,可以...

    第15章 javascript面向对象与原型

    在深入讲解JavaScript面向对象与原型的知识点之前,首先需要了解JavaScript的基础知识。在JavaScript中,面向对象编程(OOP)的概念虽然存在,但是它的实现与传统基于类的语言有所不同。ECMAScript,也就是...

    JavaScript面向对象实现简单工厂模式

    JavaScript面向对象实现简单工厂模式是一种常见的设计模式,它在软件工程中被广泛应用于创建对象的场景。简单工厂模式的核心思想是将对象的创建过程抽象出来,由一个专门的工厂类负责,使得客户端代码无需关心具体...

    javascript 经典面向对象设计

    ### JavaScript经典面向对象设计 #### 标题与描述解析 标题“JavaScript经典面向对象设计”指出了本书的主要内容是关于如何使用面向对象编程(OOP)原则和技术来编写高质量、可扩展且可重用的JavaScript应用程序及...

    面向对象JavaScript精要(英文原版pdf)

    ### 面向对象JavaScript精要 #### 一、书籍概览 本书《面向对象JavaScript精要》由Nicholas C. Zakas编写,是面向对象编程领域中的权威指南之一,尤其针对JavaScript这门语言。作者深入浅出地介绍了面向对象编程的...

    JavaScript面向对象编程指南

    《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...

    JavaScript面向对象编程指南.pdf

    JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库

    JS弹性导航条---面向对象

    JavaScript支持三种主要的面向对象模式:构造函数、原型和类(ES6引入)。在构建导航条时,我们可以定义一个构造函数,用于创建导航条对象。这个构造函数可能包括一些初始化参数,如导航条的位置、颜色、链接列表等...

    JavaScript面向对象编程指南 pdf

    下面将详细探讨JavaScript面向对象编程的基本原理、特性以及实际应用。 1. **类与对象** - 在JavaScript中,对象是键值对的集合,可以通过字面量语法或构造函数创建。例如: ```javascript const person = { ...

    js面向对象简单理解

    JavaScript是一种广泛应用于Web开发的动态编程语言,尤其以其强大的面向对象特性而闻名。面向对象编程(Object-Oriented ...通过阅读`prototype.js`这样的示例代码,可以帮助加深对JavaScript面向对象编程的理解。

    javascript面向对象编程

    面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码重用为目的的继承模式;BOM、DOM、浏览器事件、AJAX和JSON;如何实现JavaScript中缺失的...

    JavaScript面向对象编程指南(第2版).rar

    JavaScript是一种广泛...通过深入学习这本《JavaScript面向对象编程指南(第2版)》,开发者不仅能掌握JavaScript的面向对象编程基础,还能了解到实际项目中如何有效地运用这些知识,提升编程技巧和解决问题的能力。

    JS面向对象汇总PDF

    **JS面向对象汇总PDF**是针对JavaScript编程语言中面向对象编程概念的一个综合性的学习资料,主要探讨了JavaScript如何实现面向对象编程(OOP)的设计原则和模式。在JavaScript中,面向对象编程是一种重要的编程范式...

    javascript 面向对象编程.pdf javascript 设计模式与开发实践.pdf

    面向对象编程(Object-Oriented Programming, OOP)是JavaScript中的核心概念,而设计模式则是解决常见编程问题的经验总结,对于提升代码质量和可维护性至关重要。这两本书——"JavaScript 面向对象编程.pdf"和...

    JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)

    本文将深入探讨JavaScript中的面向对象基础,包括工厂模式、构造函数模式、原型模式、混合模式和动态原型模式。 工厂模式是一种简单但有效的方式,用于创建对象,尤其是当我们需要创建具有相同结构但可能具有不同值...

    JavaScript面向对象编程

    JavaScript面向对象编程是一种基于原型(Prototype)的编程范式,它是动态类型语言,允许开发者创建具有复杂特性的对象。在JavaScript中,面向对象主要通过构造函数、原型链和闭包来实现。以下是对这一主题的详细...

    JavaScript面向对象高级编程

    ### JavaScript面向对象高级编程知识点概述 #### 面向对象编程(OOP) 1. **继承**:继承是OOP的核心概念之一,它允许我们创建一个类,该类继承了另一个类的属性和方法。继承机制是实现代码重用和创建类之间层次结构...

    猜拳游戏:java面向对象,kotlin面向对象,js面向对象,3个方法开发.zip

    标题 "猜拳游戏:java面向对象,kotlin面向对象,js面向对象,3个方法开发.zip" 提供了关于一个编程项目的概览,这个项目采用了三种不同的编程语言——Java、Kotlin和JavaScript,来实现同一个猜拳游戏。面向对象...

    js面向对象笔记

    总之,JavaScript 面向对象编程虽然没有传统意义上的类和继承,但是通过构造函数和原型对象,以及原型链的机制,也能够实现面向对象编程的所有特性。学习面向对象编程能够帮助开发者编写出更清晰、更结构化、更易于...

Global site tag (gtag.js) - Google Analytics