代码之家  ›  专栏  ›  技术社区  ›  Peter

为什么外部JS文件中的默认属性没有被object中的用户定义属性覆盖?

  •  1
  • Peter  · 技术社区  · 8 年前

    <script>
        userControls = { 
            transition : 'fade',
            nextText : 'Next'
        }
    </script>
    

    var defControls = {
            transition : 'default',
            nextText : 'Next &raquo;'
        };
        var userControls = {};    
        
        // CHECKS FOR userControls
        if (Object.getOwnPropertyNames(userControls).length > 0) {
            var controls = Object.assign({}, defControls, userControls);
        } else {
            controls = defControls;
        }
    
        console.log(userControls);
        console.log(controls);
        console.log(defControls);
    <!DOCTYPE html>
    <html>
    <head>
    <link type="text/css" rel="stylesheet" href="styles.css">
    
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    <!-- EXTERNAL SCRIPT THAT ACCEPTS USER'S NEW SETTINGS -->
    <script type="text/javascript" src="script.js"></script>
    </head>
    <body>
    
    <!-- SENDS THE NEW PARAMETERS TO script.js -->
    <script>
    userControls = { 
    	transition : 'fade',
    	nextText : 'Next'
    }
    </script>
    
    
    </body>
    </html>
    2 回复  |  直到 8 年前
        1
  •  0
  •   Bharata colxi    8 年前

    您的代码中有四个半错误:

    1. 必须用代码编写内联脚本: var userControls = {transition: 'fade', nextText: 'Next'}; 在外部JS文件之前。别忘了 ; 最后(这是一半的错误)。
    2. 线路 var userControls = {}; 在外部JS文件中 已覆盖中的设置 userControls . 我想你想改写 var controls = {}; .
    3. 这个 var控制={}; 你得先写 if...else 声明。
    4. 你在写什么 console.log(userControls); console.log(JSON.stringify(userControls)); 你的代码只写 [object Object] 在IE的开发者控制台中,但在Chrome中是可以的。

    带修正代码的解决方案

    <!DOCTYPE html>
    <html><head>
    <!-- 
    <link type="text/css" rel="stylesheet" href="styles.css">
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
     -->
    <!-- SENDS THE NEW PARAMETERS TO script.js -->
    <script type="text/javascript">
    var userControls =
    { 
        transition : 'fade',
        nextText : 'Next'
    };
    </script>
    
    <!-- EXTERNAL SCRIPT THAT ACCEPTS USER'S NEW SETTINGS
     src="script.js" -->
    <script type="text/javascript">
    var defControls =
    {
        transition : 'default',
        nextText : 'Next &raquo;'
    };
    //THIS WAS THE MISTAKE: var userControls = {}; this line has overwrited the settings
    
    var controls = {};
    
    // CHECKS FOR userControls
    if(Object.getOwnPropertyNames(userControls).length > 0)
    {
        controls = Object.assign({}, defControls, userControls);
    }
    else
    {
        controls = defControls;
    }
    
    console.log('userControls =\n' + JSON.stringify(userControls, null, '\t'));
    console.log('controls =\n' + JSON.stringify(controls, null, '\t'));
    console.log('defControls =\n' + JSON.stringify(defControls, null, '\t'));
    </script>
    </head>
    <body></body>
    </html>
        2
  •  0
  •   Ertan Kara    8 年前

    这是因为您在加载js文件后插入了用户选择。它首先通过以下控件

    if (Object.getOwnPropertyNames(userControls).length > 0)

    false