通过Object.defineProperty添加prototype属性会覆盖构造函数属性

时间:2016-08-26 07:33:05

标签: javascript prototype

function Test(){
this.time='pat';
}

Object.defineProperty(Test.prototype, 'time', {
    configurable: true,
    get: function () { return 'test'; }
});

var a=new Test();

console.log(a.time); //test

为什么a.time返回值是' test',我很困惑。

2 个答案:

答案 0 :(得分:2)

由于time不是简单属性,因此对它的赋值使用原型上的属性定义。由于原型上的属性是使用 getter 而不是 setter 定义的,因此无法将其分配给。如果你处于严格模式(通常是一个好主意),你会得到一个错误。

构造函数可以在实例上创建一个“自己的”time属性,而不是简单的赋值;它必须使用defineProperty来执行此操作:

function Test(){
  Object.defineProperty(this, "time", {
    writable: true,
    enumerable: true,
    configurable: true,
    value: 'pat'
  });
}

Object.defineProperty(Test.prototype, 'time', {
    configurable: true,
    get: function () { return 'test'; }
});

var a=new Test();
console.log(a.hasOwnProperty("time")); // true
console.log(a.time); //pat
a.time = "updated";
console.log(a.time); //updated

答案 1 :(得分:0)

因为这是您定义要返回的function aiosc_clean_content($string,$html_tags="", $autop = true) { $string = aiosc_preclean_content($string); if(empty($html_tags)) $html_tags = "<b><strong><em><i><br><hr><p><span><small><h1><h2><h3><h4><h5><ul><ol><li><a><del><blockquote><pre><code><script>"; $string = strip_tags($string,$html_tags); if($autop) $string = wpautop($string); $text = preg_replace_callback("~<code>(.*?)<\/code>~",'replaceInCode',$string); return $text; } function aiosc_preclean_content($string) { $rplc = array( "\\'"=>"'", '\\"'=>'"', "\\\\"=>"\\", "‘"=>"'", "’"=>"'", "“"=>'"', "”"=>'"', ); return str_replace(array_keys($rplc),array_values($rplc),$string); } function replaceInCode($match){ $replace = array('<' => '&lt;','>' => '&gt;'); $text = str_replace(array_keys($replace),array_values($replace),$match[1]); return '<code>'.$text.'</code>'; } 方法的内容。无论你有什么价值,get返回的函数都是它解析的值。

请参阅:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

get

如果您想知道为什么console.log输出新值而不是最初定义的值,那是因为您将Object.defineProperty(Test.prototype, 'time', { configurable: true, get: function () { return 'A new value!'; } }); var a = new Test(); console.log(a.time); //A new value! 设置为重新配置Object.defineProperty为新值新的实例也是一个新的价值。

您可以自己测试一下:

Test.prototype.time

当你实例化function Test(){ this.time='pat'; } // This instance will have the old values var b = new Test(); // Change value returned by Test.time by new Test instances Object.defineProperty(Test.prototype, 'time', { configurable: true, get: function () { return 'A new value!'; } }); var a = new Test(); console.log(a.time); // A new value! consoel.log(b.time); // pat 时,你给了你一个带有原始定义的实例。但是,当您实例化b时,您使用a的新定义创建了一个实例,这就是为什么它不同的原因。