`
Supanccy2013
  • 浏览: 213343 次
  • 性别: 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

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

    JavaScript面向对象编程指南

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

    JavaScript面向对象编程指南.pdf

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

    javascript面向对象编程

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

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

    主要介绍了面向对象JS基础讲解,工厂模式、构造函数模式、原型模式、混合模式、动态原型模式,需要的朋友可以参考下

    JavaScript面向对象编程指南 英文版

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

    JavaScript面向对象编程指南 有书签

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

    JavaScript面向对象基础PPT

    JavaScript面向对象基础PPT,讲述了何谓面向对象、面向对象特点、组成及写法、工厂模式、原型以及如何将普通面向过程的代码转换为面向对象的基本原则

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

    在上篇文章给大家介绍了javascript面向对象基础,本篇文章继续深入学习javascript面向对象,JS的语法非常灵活,简单的对象创建就有好几种不同的方法。这些过于灵活的地方有时候确实很让人迷惑,那么今天我们就来梳理...

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

    1.本书是唯一一本介绍JavaScript面向对象编程的图书。, 2.本书作者是知名的Web开发人员和作者。受到国内众多前端开发人员,如淘宝UED团队的推崇和推荐。 Stoyan Stefanov:Facebook公司工程师、作家、演说家。他经常...

    javascript面向对象编程的几种模式详解

    构造函数与字面量结合模式、动态原型模式、寄生构造模式、稳妥构造模式、借调函数。 用哪个就把哪个的注释打开哦!

    简单分析javascript面向对象与原型

    本文主要内容参考来自JavaScript高级程序设计,面向对象与原型章节: 1、工厂模式 ECMAScript 可以通过工厂模式来创建对象: //工厂模式 function createObject(name, age) { var obj = new Object(); //创建对象 ...

    JavaScript面向对象程序设计三 原型模式(上)

    在javaScript面向对象设计一和Javascript面向对象设计二中分别介绍了工厂模式和构造函数模式,以及他们格式的优缺点,今天继续讲解原型模式

Global site tag (gtag.js) - Google Analytics